用一个命令修改不同文件夹中的多个文件?

用一个命令修改不同文件夹中的多个文件?

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 通配符。

  1. find有一个-exec选项可让您指定要对其每个结果执行的操作。它使每个查找结果可用,{}并且您可以根据需要修改它们。当您想要给出参数时(例如echo foo > file),情况会稍微复杂一些。为此,您需要告诉 find'sexec运行 shell。因此,要回显foo找到的每个文件,您可以运行:

    find /etc/ -name abc.txt -path "/etc/zyz*" \
        -exec bash -c "echo 'New line data' >> {}" \;
    
  2. 外壳通配符。某些 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
    

相关内容