Antworten:
Führen Sie aus dem Verzeichnis direkt über F1 dieses Skript aus:
Mit dem Skript soll vermieden werden, dass redundante Fotoverzeichnisse unter Fotoverzeichnissen erstellt werden.
Außerdem soll verhindert werden, dass es versehentlich von einem falschen Speicherort wie dem Stammverzeichnis des Benutzers ausgeführt wird, während das F1
Verzeichnis nicht angezeigt wird und versehentlich Hunderte von Fotoverzeichnissen in den falschen Palästen erstellt werden.
Außerdem war es meine Absicht, ein einfach zu befolgendes 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:
p
in photo
Großbuchstaben geändert .ls
wird nicht analysiert. Es ist nur ein Feedback an den Benutzer ... das zeigt, was passiert. Genau wie die Worte "Dies ist ein Fotoverzeichnis". Der Benutzer wird darüber informiert, warum dort kein Verzeichnis erstellt wird.
find -type d F1
, vielleicht?
$i/Photo
wird, das OP jedoch nicht angegeben hat, was in einem solchen Fall zu tun ist. $i
Dies wird auch in dem zugegebenermaßen unwahrscheinlichen Fall fehlschlagen, in dem eines der s eine neue Zeile enthält.
Sie können dies mit einem einzigen find
Anruf erreichen.
find . -name 'Photo' -prune -o -type d -exec mkdir {}/Photo \;
Der Teil -name 'Photo' -prune -o
weist darauf hin, dass nicht auf vorhandene (und neu erstellte) Photo
Verzeichnisse zurückgegriffen werden soll: Wenn die gefundene Datei (oder das gefundene Verzeichnis) den Namen hat Photo
, beenden Sie die Verarbeitung ( -prune
). Im anderen Fall ( -o
) fahren Sie mit Verzeichnissen ( -type d
) fort und führen Sie -exec
den Befehl ( ) aus.
-prune
? :) Ja, es ist ziemlich kontraintuitiv, aber es lohnt sich zu lernen.
-type d
zusammen mit -name 'Photo'
vorher angeben -prune
.
find
wird mit anderen Ordnern fortfahren (einschließlich Unterordnern dieses Ordners, wenn Sie danach fragen).
Sie können find
Ergebnisse an übergeben, while
anstatt, for
da auf diese Weise die Dateinamen nicht unterbrochen werden
Zuerst CD in das Verzeichnis F1
, dann:
find -type d | while read dir ; do mkdir "$dir"/Photo ; done
Wenn das Verzeichnis existiert, mkdir
wird es einfach nicht erstellt, also kein Problem ...
Wenn Ihre Verzeichnisnamen Zeilenumbrüche oder andere exotische Fremdheiten enthalten könnten, verwenden Sie diese, die mit beliebigen Namen umgehen können:
find -type d -print0 | while IFS= read -r -d '' dir ; do mkdir "$dir"/Photo ; done
Vielen Dank an @terdon für die Hilfe dabei :)
F1
Verzeichnis des Ops befindet ~user/Pictures
, wird beim Verschieben in das übergeordnete Verzeichnis und Ausführen der Zeile Photo
in jedem Verzeichnis in seinem Bereich ein Verzeichnis abgelegt , das Tausende sein kann. F1
Fügen Sie das als Teil der Kommanline hinzu, um einen leicht gemachten Fehler zu vermeiden. Auf diese Weise werden keine Verzeichnisse erstellt, wenn es versehentlich vom falschen Ort ausgeführt wird.
F1
stattdessen zu tun , bearbeitet @LDJames
Python mit os.walk
kann es ziemlich einfach und in nur wenigen Codezeilen tun
$ mkdir dir_one dir_two
$ mkdir dir_two/dir_three
$ python -c 'import os;[os.mkdir(r + "/Pictures") for r,d,f in os.walk(".")]'
$ tree
.
├── dir_one
│ └── Pictures
├── dir_two
│ ├── dir_three
│ │ └── Pictures
│ └── Pictures
└── Pictures
Wir haben es mit diesem Befehl zu tun: python -c 'import os; [os.mkdir (r + "/ Pictures") für r, d, f in os.walk (".")]'
Hier rufen wir einfach den Python-Interpreter mit -c
Flag auf, um den Befehl in einfachen Anführungszeichen anzugeben. os.walk()
Mit der Funktion können wir alle Unterverzeichnisse rekursiv durchlaufen. Für jedes Unterverzeichnis (dargestellt durch r
) erstellen wir über die os.mkdir()
Funktion den Ordner Bilder . r+"/Pictures"
ist nur eine einfache Zeichenfolgenmanipulation, um die Unterverzeichniszeichenfolge und die Zeichenfolge "/ Pictures" zu einem Pfad zusammenzufügen
Ersetzen Sie "/ Pictures" durch "/ Photo", um Ihren Anforderungen zu entsprechen
Wenn Sie bash verwenden, können Sie einfach Folgendes ausführen:
shopt -s globstar
for d in **/; do mkdir -p "$d"/Photo; done
Mit dieser globstar
Option werden **
"alle Dateien und 0 oder mehr Verzeichnisse und Unterverzeichnisse" abgeglichen. Mit anderen Worten, es passt alles rekursiv an. Wegen der /
am Ende **/
werden alle Verzeichnisse und Unterverzeichnisse (keine Dateien) übereinstimmen. Daher $d
iteriert der über alle Verzeichnisse im aktuellen Verzeichnis und deren Unterverzeichnisse, und das Photos
Verzeichnis wird in jedem von ihnen erstellt.
Die -p
Flagge der mkdir
Mittel:
-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 vorhanden ist. Entfernen Sie es, wenn Sie die Fehler sehen möchten.
Beachten Sie, dass dadurch kein Photo
Unterverzeichnis in einem Zielverzeichnis erstellt werden kann, das eine Datei mit dem Namen Photo enthält. Sie haben jedoch nicht angegeben, was in diesen Fällen zu tun ist, und alle anderen bisher veröffentlichten Antworten haben ebenfalls diese Einschränkung.