如何遞歸地將文件新增(或觸碰)到目前目錄以及所有子目錄?
例如,
我想轉動這個目錄樹:
.
├── 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