現在のディレクトリとすべてのサブディレクトリにファイルを再帰的に追加(またはタッチ)するにはどうすればよいですか?
例えば、
このディレクトリツリーを有効にしたい:
.
├── 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
どうですか:
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/
を実行します。
空のファイルを作成するだけの場合は、touch
とシェルグロブを使用できます。 zshの場合:
touch **/*(/e:REPLY+=/file:)
バッシュで:
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
バッシュで:
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' _ {} +
現在のディレクトリとすべてのサブディレクトリで$ nameと呼ばれるtouch
ファイルを作成したい場合、これは機能します:
find . -type d -exec touch {}/"${name}" \;
ChuckCottrillによるterdonによる回答へのコメントは、現在のディレクトリおよびディレクトリ自体にある$ nameという名前のファイルのみtouch
になるため、機能しないことに注意してください。
OPからの要求に応じて、サブディレクトリにファイルを作成しませんが、このバージョンでは作成します。
実際にファイルを作成するには、touch
をfind
とともに使用します。
$ find . -type d -exec touch {}/file \;