Fügen Sie rekursiv eine Datei zu allen Unterverzeichnissen hinzu

13

Wie füge ich rekursiv eine Datei zum aktuellen Verzeichnis sowie zu allen Unterverzeichnissen hinzu (oder berühre sie)?

Zum Beispiel
möchte ich diesen Verzeichnisbaum drehen:

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

Antworten:

14

Wie wäre es mit:

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

Von 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

Der obige Befehl findet also alle Verzeichnisse und wird cp file DIR_NAME/auf jedem von ihnen ausgeführt.

terdon
quelle
oder finden. -type d -exec touch file {} \;
ChuckCottrill
1
oderfind . -type d -exec touch {}/file\;
Ned64
5

Wenn Sie nur eine leere Datei erstellen möchten, können Sie toucheinen Shell-Glob verwenden. In zsh:

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

In Bash:

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

Tragbar können Sie verwenden find:

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

Bei einigen findImplementierungen, aber nicht bei allen, können Sie schreibenfind . -type d -exec touch {}/file \;

Wenn Sie Referenzinhalte kopieren möchten, müssen Sie findin einer Schleife aufrufen . 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

Tragbar:

find . -type d -exec sh -c 'for d; do cp -p reference_file "$d/file"; done' _ {} +
Gilles 'SO - hör auf böse zu sein'
quelle
2

Wenn Sie touchDateien mit dem Namen $ name im aktuellen Verzeichnis und in allen Unterverzeichnissen verwenden möchten, funktioniert dies wie folgt:

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

Beachten Sie, dass der Kommentar von ChuckCottrill zur Antwort von terdon NICHT funktioniert, da nur touchdie Datei $ name im aktuellen Verzeichnis und das Verzeichnis selbst verwendet werden.

Es werden keine Dateien in Unterverzeichnissen erstellt, wie vom OP angefordert, während diese Version hier dies tut.

C König
quelle
0

Um tatsächlich nur eine Datei erstellen, können Sie touchmit find:

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