Tüm alt dizinlere özyineli olarak bir dosya ekleyin


14

Tüm alt dizinlerin yanı sıra geçerli dizine bir dosyayı yinelemeli olarak nasıl ekleyebilirim (veya bu dosyaya dokunabilirim)?

Örneğin,
bu dizin ağacını açmak istiyorum:

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

içine

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

9 directories, 10 files

Yanıtlar:


14

Nasıl olur:

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

Gönderen 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

Yani, yukarıdaki komut tüm dizinleri bulacak ve cp file DIR_NAME/her birinde çalışacaktır.


veya bulun. -tip d -exec dokunmatik dosya {} \;
ChuckCottrill

1
veya,find . -type d -exec touch {}/file\;
Ned64

6

Sadece boş bir dosya oluşturmak istiyorsanız, touchve bir kabuk glob kullanabilirsiniz. Zsh dilinde:

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

Bash'da:

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

Taşınabilir olarak şunları kullanabilirsiniz find:

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

findHepsi değil, bazı uygulamalar yazmanıza izin verinfind . -type d -exec touch {}/file \;

Bazı referans içerikleri kopyalamak istiyorsanız find, bir döngü içinde çağrı yapmanız gerekir . Zsh dilinde:

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

Bash'da:

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

portably:

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

2

touchGeçerli dizinde ve tüm alt dizinlerde $ name adlı dosyaları istediğinizde bu çalışır:

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

Sadece touchgeçerli dizinde ve dizinin kendisinde $ name adlı dosyada çalışacağı için ChuckCottrill'in terdon tarafından verilen cevaba yönelik yorumunun çalışmadığını unutmayın .

OP'nin istediği gibi alt dizinlerde dosya oluşturmayacak, buradaki sürüm ise.


0

Aslında sadece bir dosya oluşturmak için kullanabileceğiniz touchile find:

$ find . -type d -exec touch {}/file \;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.