Secara rekursif menambahkan file ke semua sub-direktori

14

Bagaimana cara menambahkan (atau menyentuh) file secara rekursif ke direktori saat ini, serta semua sub-direktori?

Sebagai contoh,
saya ingin mengubah pohon direktori ini:

.
├── 1
   ├── A
   └── B
├── 2
   └── A
└── 3
    ├── A
    └── B
        └── I   
9 directories, 0 files

ke

.
├── 1
   ├── A
      └── file
   ├── B
      └── file
   └── file
├── 2
   ├── A
      └── file
   └── file
├── 3
   ├── A
      └── file
   ├── B
      ├── file
      └── I
          └── file
   └── file
└── file

9 directories, 10 files
Trevor Hickey
sumber

Jawaban:

14

Bagaimana tentang:

find . -type d -exec cp file {} \;

Dari 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

Jadi, perintah di atas akan menemukan semua direktori dan menjalankannya cp file DIR_NAME/masing-masing.

terdon
sumber
atau, temukan. -type d -exec touch file {} \;
ChuckCottrill
1
atau,find . -type d -exec touch {}/file\;
Ned64
6

Jika Anda hanya ingin membuat file kosong, Anda dapat menggunakan touchdan shell glob. Dalam zsh:

touch **/*(/e:REPLY+=/file:)

Dalam bash:

shopt -s globstar
for d in **/*/; do touch -- "$d/file"; done

Portable, Anda dapat menggunakan find:

find . -type d -exec sh -c 'for d; do touch "$d/file"; done' _ {} +

Beberapa findimplementasi, tetapi tidak semua, memungkinkan Anda menulisfind . -type d -exec touch {}/file \;

Jika Anda ingin menyalin beberapa konten referensi, maka Anda harus menelepon finddalam satu lingkaran. Dalam zsh:

for d in **/*(/); do cp -p reference_file "$d/file"; done

Dalam bash:

shopt -s globstar
for d in **/*/; do cp -p reference_file "$d/file"; done

Mudah dibawa:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

Saat ingin touchfile bernama $ name di direktori saat ini dan di semua subdirektori, ini akan berfungsi:

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

Perhatikan bahwa komentar oleh ChuckCottrill ke jawaban oleh terdon TIDAK berfungsi, karena hanya touchfile yang bernama $ name di direktori saat ini dan direktori itu sendiri.

Itu tidak akan membuat file dalam subdirektori seperti yang diminta oleh OP, sementara versi ini di sini akan.

C König
sumber
0

Untuk benar-benar hanya membuat file, Anda dapat menggunakan touchdengan find:

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