Aggiungi ricorsivamente un file a tutte le sottodirectory


13

Come posso aggiungere (o toccare) ricorsivamente un file nella directory corrente, così come in tutte le sottodirectory?

Ad esempio,
vorrei trasformare questo albero di directory:

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

in

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

9 directories, 10 files

Risposte:


14

Che ne dite di:

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

Da 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

Quindi, il comando sopra troverà tutte le directory ed eseguirà cp file DIR_NAME/su ognuna di esse.


oppure, trova. -type d -exec touch file {} \;
ChuckCottrill,

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

5

Se vuoi solo creare un file vuoto, puoi usare touche un glob shell. In zsh:

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

In bash:

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

Portabilmente, puoi usare find:

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

Alcune findimplementazioni, ma non tutte, ti permettono di scriverefind . -type d -exec touch {}/file \;

Se vuoi copiare alcuni contenuti di riferimento, dovrai chiamare findin loop. In zsh:

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

In bash:

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

portabile:

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

2

Quando vuoi touchfile chiamati $ name nella directory corrente e in tutte le sottodirectory, questo funzionerà:

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

Si noti che il commento di ChuckCottrill alla risposta di terdon NON funziona, poiché sarà solo touchil file chiamato $ name nella directory corrente e la directory stessa.

Non creerà file in sottodirectory come richiesto dall'OP, mentre questa versione qui lo farà.


0

Per creare semplicemente un file, è possibile utilizzare touchcon find:

$ find . -type d -exec touch {}/file \;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.