
Ich habe eine Reihe von Ordnern und möchte alle diese Ordner durchlaufen und in jedem Ordner einen weiteren Ordner mit dem Namen "Foto" erstellen.
F1
--F11
----F111
----F112
--F12
Ich möchte haben:
F1
--Photo
--F11
----Photo
----F111
------Photo
----F112
------Photo
--F12
----Photo
Antwort1
Dies ist mit einem einzigen Anruf möglich find
.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Der Abschnitt -name 'Photo' -prune -o
weist darauf hin, nicht zu bestehenden (und neu erstellten) Photo
Verzeichnissen zu rekursieren: Wenn die gefundene Datei (oder das Verzeichnis) den Namen hat Photo
, brechen Sie die Verarbeitung ab ( -prune
). Im anderen Fall ( -o
) fahren Sie mit den Verzeichnissen fort ( -type d
) und führen Sie -exec
den Befehl aus ( ).
Antwort2
Sie können find
Ergebnisse an while
statt an übergeben for
, da es auf diese Weise nicht zu Problemen kommt, wenn die Dateinamen Leerzeichen enthalten
Wechseln Sie zunächst mit cd in das Verzeichnis F1
und führen Sie dann Folgendes aus:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Wenn das Verzeichnis vorhanden ist, mkdir
wird die Erstellung einfach abgelehnt. Hier gibt es also kein Problem ...
Wenn Ihre Verzeichnisnamen Zeilenumbrüche oder andere exotische Merkwürdigkeiten enthalten könnten, verwenden Sie Folgendes, das mit beliebigen Namen umgehen kann:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Danke an @terdon für die Hilfe :)
Antwort3
Führen Sie im Verzeichnis direkt über F1 dieses Skript aus:
Der Zweck des Skripts besteht darin, die Erstellung redundanter Fotoverzeichnisse unter Fotoverzeichnissen zu vermeiden.
Darüber hinaus ist es so konzipiert, dass es nicht versehentlich von einem falschen Ort, beispielsweise dem Stammverzeichnis des Benutzers, ausgeführt wird. In diesem Fall würde das Programm das F1
Verzeichnis nicht sehen und irrtümlicherweise Hunderte von Fotoverzeichnissen in den falschen Verzeichnissen erstellen.
Außerdem war es meine Absicht, ein leicht verständliches Skript zu erstellen, damit der Benutzer es anpassen kann.
#!/bin/bash
while IFS= read -r -d '' i;
do
if [[ ! -d $i/Photo ]]; then
# Filter to skip folders named Photo
thisfolder="$(echo $i | sed "s/.*\///")"
if [[ ! $thisfolder == "Photo" ]]; then
mkdir "$i/Photo"
fi
fi
done < <(find F1 -type d -print0)
Skript aktualisiert:
- Kleinbuchstaben
p
inphoto
Großbuchstaben geändert. - Unterstützung für nicht standardmäßige Dateinamen hinzugefügt (mit Vorschlägen von Terdon).
Antwort4
Wenn Sie Bash verwenden, können Sie einfach Folgendes ausführen:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
Die globstar
Option führt zu **
einer Übereinstimmung mit „allen Dateien und 0 oder mehr Verzeichnissen und Unterverzeichnissen“. Mit anderen Worten, es wird rekursiv mit allem abgeglichen. Aufgrund von am /
Ende **/
werden alle Verzeichnisse und Unterverzeichnisse (keine Dateien) abgeglichen. Daher $d
wird über alle Verzeichnisse im aktuellen Verzeichnis und deren Unterverzeichnisse iteriert und das Photos
Verzeichnis wird in jedem von ihnen erstellt.
Die -p
Flagge mkdir
bedeutet:
-p, --parents
no error if existing, make parent directories as needed
Hier verwende ich es nur, um Fehlermeldungen zu unterdrücken, wenn das Zielverzeichnis bereits existiert. Entfernen Sie es, wenn Sie die Fehler sehen möchten.
Photo
Beachten Sie, dass dadurch kein Unterverzeichnis in einem Zielverzeichnis erstellt wird , das eineDateimit dem Namen „Foto“. Sie haben jedoch nicht angegeben, was in diesen Fällen getan werden soll, und alle anderen bisher geposteten Antworten unterliegen ebenfalls dieser Einschränkung.