Rekurencyjnie dodaj plik do wszystkich podkatalogów

14

Jak rekurencyjnie dodać (lub dotknąć) plik do bieżącego katalogu, a także do wszystkich podkatalogów?

Na przykład
chciałbym zmienić to drzewo katalogów:

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

w

.
├── 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
źródło

Odpowiedzi:

14

Co powiesz na:

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

Od 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

Tak więc powyższe polecenie znajdzie wszystkie katalogi i uruchomi się cp file DIR_NAME/na każdym z nich.

terdon
źródło
lub znajdź. -type d -exec plik dotykowy {} \;
ChuckCottrill
1
lubfind . -type d -exec touch {}/file\;
Ned64
6

Jeśli chcesz tylko utworzyć pusty plik, możesz użyć touchglobu powłoki. W Zsh:

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

W bash:

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

Przenośnie możesz użyć find:

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

Niektóre findimplementacje, ale nie wszystkie, pozwalają pisaćfind . -type d -exec touch {}/file \;

Jeśli chcesz skopiować niektóre materiały referencyjne, musisz zadzwonić findw pętli. W Zsh:

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

W bash:

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

Przenośny:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Gilles „SO- przestań być zły”
źródło
2

Jeśli chcesz uzyskać touchpliki o nazwie $ name w bieżącym katalogu i we wszystkich podkatalogach, zadziała to:

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

Zauważ, że komentarz ChuckCottrill do odpowiedzi terdon NIE działa, ponieważ będzie to tylko touchplik o nazwie $ name w bieżącym katalogu i sam katalog.

Nie będzie tworzyć plików w podkatalogach zgodnie z żądaniem OP, podczas gdy ta wersja tutaj.

C König
źródło
0

Aby faktycznie utworzyć plik, możesz użyć touchz find:

$ find . -type d -exec touch {}/file \;
miked
źródło