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


14

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

例如,
我想打开这个目录树:

.
├── 1
   ├── A
   └── B
├── 2
   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

进入

.
├── 1
   ├── A
      └── file
   ├── B
      └── file
   └── file
├── 2
   ├── A
      └── file
   └── file
├── 3
   ├── A
      └── file
   ├── B
      ├── file
      └── I
          └── file
   └── file
└── file

9 directories, 10 files

Answers:


14

怎么样:

find . -type d -exec cp file {} \;

来自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

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


或者,找到。-d型-exec触摸文件{} \;
ChuckCottrill

1
find . -type d -exec touch {}/file\;
2015年

6

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

touch **/*(/e:REPLY+=/file:)

在bash中:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

可移植地,您可以使用find

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

有些find实现(但不是全部)可以让您编写find . -type d -exec touch {}/file \;

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

for d in **/*(/); do cp -p reference_file "$d/file"; done

在bash中:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

便携性:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +

2

想要touch在当前目录和所有子目录中存储名为$ name的文件时,这将起作用:

find . -type d -exec touch {}/"${name}"  \;

请注意,ChuckCottrill对terdon答案的评论不起作用,因为它将仅touch在当前目录和目录本身中名为$ name的文件。

它不会按照OP的要求在子目录中创建文件,而此处将使用此版本。


0

要实际只需要创建一个文件,你可以用touchfind

$ find . -type d -exec touch {}/file \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.