您尚未登录。

#1 2021-12-06 16:34:12

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 927
个人网站

多个文本文件添加相同内容

有一个总目录,总目录下有很多子目录,子目录中又有目录;所有目录中都有文件,文件有多种类型。

我现在想做的是,把总目录中及所有子目录中的后缀为txt的文本文件,全部在末尾添加三行相同内容:

 
.. |date| date::
*最近一次更新:* |date|

(一个空行加上两行字符)

咋弄比较快?文件有点多~


开源/Linux大众化,从驿窗开始~

离线

#2 2021-12-06 19:11:46

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 多个文本文件添加相同内容

sed -i '$a内容
内容
内容' **/*.txt

(zsh; bash 的话自己 find 吧)

离线

#3 2021-12-06 19:13:04

tanloong
会员
注册时间: 2021-08-15
帖子: 28

Re: 多个文本文件添加相同内容

假设总目录是 ~/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)

离线

#4 2021-12-06 19:40:08

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 多个文本文件添加相同内容

对哦,直接 >> 就行了。

离线

#5 2021-12-07 07:52:50

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 927
个人网站

Re: 多个文本文件添加相同内容

for filename in $(find . -name '*txt'); do
echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename"
done

这个有效,不过不知道是不是环境的原因,我需要在第一个\n后面再加一个\n,要不然不会添加空行。



sed -i '$a内容
内容
内容' **/*.txt

这个在bash下确实报错,我再研究下~


开源/Linux大众化,从驿窗开始~

离线

#6 2021-12-07 10:08:24

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 多个文本文件添加相同内容

驿窗 说:
for filename in $(find . -name '*txt'); do
echo -e '\n.. |date| date::\n*最近一次更新:* |date|' >> "$filename"
done

这个有效,不过不知道是不是环境的原因,我需要在第一个\n后面再加一个\n,要不然不会添加空行。

说明你的文件之前最后一行没有以换行符结束?

离线

#7 2021-12-07 10:43:19

驿窗
驿窗
所在地: 基础开源研究
注册时间: 2016-06-03
帖子: 927
个人网站

Re: 多个文本文件添加相同内容

我看了一下,最后一行结束位置确实不是换行符~


开源/Linux大众化,从驿窗开始~

离线

#8 2021-12-17 12:55:48

xiao80
会员
注册时间: 2021-11-14
帖子: 66

Re: 多个文本文件添加相同内容

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 设置的方式,感觉比这个复杂。

离线

#9 2021-12-17 13:13:29

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 多个文本文件添加相同内容

那个 for in find 显然不行。
我平常都是用 zsh 的,没这种问题。

离线

#10 2021-12-17 13:21:32

tanloong
会员
注册时间: 2021-08-15
帖子: 28

Re: 多个文本文件添加相同内容

xiao80 说:
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)

离线

#11 2021-12-17 14:19:54

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 8,384
个人网站

Re: 多个文本文件添加相同内容

你这文件名要是有个换行符也会挂啦。

离线

#12 2021-12-17 14:23:26

tanloong
会员
注册时间: 2021-08-15
帖子: 28

Re: 多个文本文件添加相同内容

文件名还能包含换行符吗?好吧……

离线

页脚