页次: 1
有一个总目录,总目录下有很多子目录,子目录中又有目录;所有目录中都有文件,文件有多种类型。
我现在想做的是,把总目录中及所有子目录中的后缀为txt的文本文件,全部在末尾添加三行相同内容:
.. |date| date::
*最近一次更新:* |date|
(一个空行加上两行字符)
咋弄比较快?文件有点多~
开源/Linux大众化,从驿窗开始~
离线
sed -i '$a内容
内容
内容' **/*.txt
(zsh; bash 的话自己 find 吧)
离线
假设总目录是 ~/dir:
cd ~/dir
for filename in $(find . -name '*txt'); do
echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename"
done
执行上面的命令之前,如果要测试的话,可以用下面的命令新建临时目录:
mkdir -p dir-{1..10}/subdir-{1..10}
touch dir-{1..10}/subdir-{1..10}/file-{1..10}.txt
touch dir-{1..10}/file-{1..10}.txt
最近编辑记录 tanloong (2022-04-01 17:06:54)
离线
对哦,直接 >> 就行了。
离线
for filename in $(find . -name '*txt'); do
echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename"
done
这个有效,不过不知道是不是环境的原因,我需要在第一个\n后面再加一个\n,要不然不会添加空行。
sed -i '$a内容
内容
内容' **/*.txt
这个在bash下确实报错,我再研究下~
开源/Linux大众化,从驿窗开始~
离线
for filename in $(find . -name '*txt'); do echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename" done
这个有效,不过不知道是不是环境的原因,我需要在第一个\n后面再加一个\n,要不然不会添加空行。
说明你的文件之前最后一行没有以换行符结束?
离线
我看了一下,最后一行结束位置确实不是换行符~
开源/Linux大众化,从驿窗开始~
离线
假设总目录是 ~/dir:
cd ~/dir for filename in $(find . -name '*txt'); do echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename" done
执行上面的命令之前,如果要测试的话,可以用下面的命令新建临时目录:
for ((i=1; i<=10; i++)); do for ((j=1; j<=10; j++)); do mkdir -p ~/dir/sub-dir-"$i"/sub-sub-dir-"$j" for ((z=1; z<=10; z++)); do touch ~/dir/sub-dir-"$i"/sub-sub-dir-"$j"/file-"$z".txt done done done
话说查找遍历文件的时候,这个方式可以处理一些特殊文件名的情况吗,比如文件名带空格。我一直都是用带 IFS 设置的方式,感觉比这个复杂。
离线
那个 for in find 显然不行。
我平常都是用 zsh 的,没这种问题。
离线
tanloong 说:假设总目录是 ~/dir:
cd ~/dir for filename in $(find . -name '*txt'); do echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename" done
执行上面的命令之前,如果要测试的话,可以用下面的命令新建临时目录:
for ((i=1; i<=10; i++)); do for ((j=1; j<=10; j++)); do mkdir -p ~/dir/sub-dir-"$i"/sub-sub-dir-"$j" for ((z=1; z<=10; z++)); do touch ~/dir/sub-dir-"$i"/sub-sub-dir-"$j"/file-"$z".txt done done done
话说查找遍历文件的时候,这个方式可以处理一些特殊文件名的情况吗,比如文件名带空格。我一直都是用带 IFS 设置的方式,感觉比这个复杂。
文件名有空格的话确实不行。就像你说的,得临时更改 IFS。啧,我考虑得不够周全,没想到特殊文件名的情况。
cd ~/dir
IFS_OLD=$IFS
IFS=$'\n'
for filename in $(find . -name '*txt'); do
echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename"
done
IFS=$IFS_OLD
最近编辑记录 tanloong (2021-12-17 13:36:53)
离线
你这文件名要是有个换行符也会挂啦。
离线
文件名还能包含换行符吗?好吧……
离线
页次: 1