如何递归地将文件添加(或触摸)到当前目录以及所有子目录中?
例如,
我想转动这个目录树:
.
├── 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
答案1
怎么样:
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/
在每个目录上运行。
答案2
如果您只想创建一个空文件,可以使用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' _ {} +
答案3
当想要touch
在当前目录和所有子目录中调用名为 $name 的文件时,这将起作用:
find . -type d -exec touch {}/"${name}" \;
请注意,ChuckCottrill 对 terdon 的答案的评论不起作用,因为它只会touch
当前目录中名为 $name 的文件和目录本身。
它不会按照OP的要求在子目录中创建文件,而这里的版本会。
答案4
我刚刚测试的另一个例子是在特定的子目录中创建连续的文件,就像我在这里一样。
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
└── FOLDER
├── FOLDER1
└── FOLDER2
我使用下面的命令仅在 FOLDER2 目录中创建具有连续编号序列的文件,例如file{1..10}
for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done