递归地将文件添加到所有子目录

Tre*_*key 17 command-line bash directory recursive

如何递归地将文件添加(或触摸)到当前目录以及所有子目录中?

例如,
我想把这个目录树:

.
??? 1
?   ??? A
?   ??? B
??? 2
?   ??? A
??? 3
    ??? A
    ??? B
        ??? I   
9 directories, 0 files
Run Code Online (Sandbox Code Playgroud)

进入

.
??? 1
?   ??? A
?   ?   ??? file
?   ??? B
?   ?   ??? file
?   ??? file
??? 2
?   ??? A
?   ?   ??? file
?   ??? file
??? 3
?   ??? A
?   ?   ??? file
?   ??? B
?   ?   ??? file
?   ?   ??? I
?   ?       ??? file
?   ??? file
??? file

9 directories, 10 files
Run Code Online (Sandbox Code Playgroud)

ter*_*don 16

怎么样:

find . -type d -exec cp file {} \;
Run Code Online (Sandbox Code Playgroud)

来自man find

   -type c
          File is of type c:
           d      directory

   -exec command ;
          Execute  command;  All following arguments to find are taken 
          to be arguments to the command until an  argument  consisting 
          of `;' is encountered.  The string `{}' is replaced by the 
          current file
Run Code Online (Sandbox Code Playgroud)

因此,上面的命令将查找所有目录并cp file DIR_NAME/在每个目录上运行。

  • 或者,`找到。-type d -exec touch {}/file\;` (2认同)

Gil*_*il' 8

如果您只想创建一个空文件,则可以使用touch和 shell glob。在 zsh 中:

touch **/*(/e:REPLY+=/file:)
Run Code Online (Sandbox Code Playgroud)

在 bash 中:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done
Run Code Online (Sandbox Code Playgroud)

便携,您可以使用find

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +
Run Code Online (Sandbox Code Playgroud)

一些find实现,但不是全部,让你写find . -type d -exec touch {}/file \;

如果要复制一些参考内容,则必须find在循环中调用。在 zsh 中:

for d in **/*(/); do cp -p reference_file "$d/file"; done
Run Code Online (Sandbox Code Playgroud)

在 bash 中:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done
Run Code Online (Sandbox Code Playgroud)

便携:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Run Code Online (Sandbox Code Playgroud)