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 touch
einen 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 find
Implementierungen, aber nicht alle, ermöglichen das Schreibenfind . -type d -exec touch {}/file \;
Wenn Sie Referenzinhalte kopieren möchten, müssen Sie find
eine 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 touch
Dateien 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 touch
die 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