すべてのサブディレクトリに繰り返しファイルを追加する

すべてのサブディレクトリに繰り返しファイルを追加する

現在のディレクトリとすべてのサブディレクトリにファイルを再帰的に追加(またはタッチ)する方法は?

たとえば、
次のディレクトリツリーを回転させたいとします。

.
├── 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シェルグロブを使用できます。 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' _ {} +

答え3

touchこれは、現在のディレクトリとすべてのサブディレクトリで$ nameというファイルを呼び出そうとしたときに機能します。

find . -type d -exec touch {}/"${name}"  \;

touchterdonの回答に対するChuckCottrillのコメントは、現在のディレクトリとディレクトリ自体の$ 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

関連情報