現在のディレクトリとすべてのサブディレクトリにファイルを再帰的に追加 (または変更) するにはどうすればよいでしょうか?
たとえば、
次のディレクトリ ツリーを有効にしたいと思います。
.
├── 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
シェル 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}" \;
terdon の回答に対する ChuckCottrill のコメントは機能しないことに注意してください。これは、touch
現在のディレクトリ内の $name というファイルとディレクトリ自体のみが対象となります。
OP の要求どおりにサブディレクトリにファイルを作成しませんが、このバージョンでは作成します。
答え4
私があなたの例を参考にしてテストしていたもう 1 つの例は、ここに示したように、特定のサブディレクトリに連続したファイルを作成することです。
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
├── FOLDER
│ ├── FOLDER1
│ └── FOLDER2
└── FOLDER
├── FOLDER1
└── FOLDER2
下記のコマンドを使用して、FOLDER2 dirに連続した番号のファイルのみを作成しました。file{1..10}
for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done