abc.txt
我的文件夹/etc/zyz/
和几个子文件夹中有一个文件/etc/zyz-1/
/etc/zyz-2/
如何使用命令修改所有以 开头的文件夹中的所有这些文件echo
(全部命名为) ?在某些机器上只有两个文件夹,在其他机器上有 10 多个abc.txt
/etc/zyz
我要运行的命令示例
echo 'New line data' >> abc.txt
abc.txt < /dev/null
答案1
给定以下树(空 abc.txt):
.
├── zyz
│ └── abc.txt
├── zyz-1
│ └── abc.txt
└── zyz-2
└── abc.txt
您可以使用以下命令列出所有 abc 文件:
$ echo zyz*/abc.txt
zyz-1/abc.txt zyz-2/abc.txt zyz/abc.txt
您可以tee -a
同时将一些输入流附加到所有这些文件:
$ echo 'New line data' | tee -a zyz*/abc.txt
New line data
如果执行两次,每个 abc.txt 将包含两行:
$ cat zyz/abc.txt
New line data
New line data
$ cat zyz-1/abc.txt
New line data
New line data
$ # ...
要清空它们,您可以执行以下操作:
$ </dev/null tee zyz*/abc.txt
或者
$ : | tee zyz*/abc.txt
find -exec
(您不应该只使用几个短名称的文件来达到 ARG_MAX 限制,而应该使用我在表单中使用的大量文件+
(请参阅联机帮助页)。)
答案2
有两种常见的方法:find
和 shell 通配符。
find
有一个-exec
选项可让您指定要对其每个结果执行的操作。它使每个查找结果可用,{}
并且您可以根据需要修改它们。当您想要给出参数时(例如echo foo > file
),情况会稍微复杂一些。为此,您需要告诉 find'sexec
运行 shell。因此,要回显foo
找到的每个文件,您可以运行:find /etc/ -name abc.txt -path "/etc/zyz*" \ -exec bash -c "echo 'New line data' >> {}" \;
外壳通配符。某些 shell(bash、zsh 和 ksh)可以处理递归通配符。在 bash 中,这是由 激活的
shopt globstar
。因此,要回显New line data
每个文件,您将运行:shopt globstar for f in /etc/zyz*/**/abc.txt; do echo "New line data" >> "$f"; done