すべてのサブディレクトリにファイルを再帰的に追加する

すべてのサブディレクトリにファイルを再帰的に追加する

現在のディレクトリとすべてのサブディレクトリにファイルを再帰的に追加 (または変更) するにはどうすればよいでしょうか?

たとえば、
次のディレクトリ ツリーを有効にしたいと思います。

.
├── 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

関連情報