Eine Datei rekursiv zu allen Unterverzeichnissen hinzufügen

Eine Datei rekursiv zu allen Unterverzeichnissen hinzufügen

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

Beispielsweise
möchte ich diesen Verzeichnisbaum umgestalten:

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

hinein

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

9 directories, 10 files

Antwort1

Wie wäre es mit:

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

Aus 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/in jedem davon ausgeführt.

Antwort2

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

Portabel können Sie Folgendes verwenden find:

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

Einige findImplementierungen, aber nicht alle, ermöglichen das Schreibenfind . -type d -exec touch {}/file \;

Wenn Sie Referenzinhalte kopieren möchten, müssen Sie findeine 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' _ {} +

Antwort3

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

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

Beachten Sie, dass der Kommentar von ChuckCottrill zur Antwort von Terdon NICHT funktioniert, da nur touchdie Datei mit dem Namen $name im aktuellen Verzeichnis und das Verzeichnis selbst betroffen sind.

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

Antwort4

Ein weiteres Beispiel, das ich gerade anhand Ihres Beispiels getestet habe, ist das Erstellen aufeinanderfolgender Dateien in bestimmten Unterverzeichnissen, wie ich es hier getan habe.

├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
├── FOLDER
│   ├── FOLDER1
│   └── FOLDER2
└── FOLDER
    ├── FOLDER1
    └── FOLDER2

Ich habe den folgenden Befehl verwendet, um nur im Ordner FOLDER2 Dateien mit fortlaufender Nummernfolge zu erstellen, wiefile{1..10}

for d in **/FOLDER2/; do touch $d/file{1..10}.doc; done

verwandte Informationen