Erstellen Sie rekursiv einen Ordner "Photo" in allen Verzeichnissen

Erstellen Sie rekursiv einen Ordner "Photo" in allen Verzeichnissen

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 -oweist darauf hin, nicht zu bestehenden (und neu erstellten) PhotoVerzeichnissen 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 -execden Befehl aus ( ).

Antwort2

Sie können findErgebnisse an whilestatt 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 F1und führen Sie dann Folgendes aus:

find -type d | while read dir ; do mkdir "$dir"/Photo ; done

Wenn das Verzeichnis vorhanden ist, mkdirwird 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 F1Verzeichnis 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 pin photoGroß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 globstarOption 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 $dwird über alle Verzeichnisse im aktuellen Verzeichnis und deren Unterverzeichnisse iteriert und das PhotosVerzeichnis wird in jedem von ihnen erstellt.

Die -pFlagge mkdirbedeutet:

  -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.

PhotoBeachten 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.

verwandte Informationen