例如我有一个层次结构a/b/c
。如何在每个文件夹中创建一个包含名称d.txt
和文本的文件?"Hello World"
a
a/b
a/b/c
答案1
带壳zsh
:
echo Hello World > a{,/b{,/c}}/d.txt
或者对于通过递归搜索在这里找到的所有非隐藏目录:
dirs=(**/*(/))
echo Hello World > $^dirs/d.txt
这涉及到内部tee
,因此输出会同时写入所有文件。如果有大量文件,您可能会遇到打开文件数量的限制,在这种情况下您可能需要按顺序写入该内容,一次一个文件:
for d ($dirs) echo Hello World > $d/d.txt
标准等效项类似于:
LC_ALL=C find . ! -name . \( -name '.*' -prune -o -type d -exec sh -c '
for dir do
echo Hello World > "$dir/d.txt"
done' sh {} + \)
LC_ALL=C
这样就-name '.*'
匹配所有以 开头的文件.
,而不仅仅是那些以 开头.
且后跟有效字符序列的文件。! -name .
只排除我们想要的当前目录子-文件夹(也不想修剪.
)-name '.*' -prune
,排除隐藏文件并防止find
下降到隐藏目录。-o
: 如果不 (或者)-type d
仅选择类型的文件目录。-exec sh -c 'inline-script' sh {} +
:将匹配目录的列表传递给内联脚本。
答案2
尝试
find . -type d -exec /bin/bash -c 'echo "Hello world" >'{}'/d.txt' \;