web-dev-qa-db-ja.com

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

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

例えば、
このディレクトリツリーを有効にしたい:

.
├── 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
13
Trevor Hickey

どうですか:

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/を実行します。

14
terdon

空のファイルを作成するだけの場合は、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からの要求に応じて、サブディレクトリにファイルを作成しませんが、このバージョンでは作成します。

2
C König

実際にファイルを作成するには、touchfindとともに使用します。

$ find . -type d -exec touch {}/file \;
0
miked