Beispiel: Ich habe das Eingabeverzeichnis wie folgt mit zwei Zweigen auf der 2. Ebene (2 und 22)
~/input_directory/1/2/3/4/5/6
~/input_directory/1/22/3/4/5/6
Ich möchte einen Befehl ausführen, um ~/output_directory
ein Unterverzeichnis mit einer Ebene zu füllen, das (leere) Unterverzeichnisse mit diesen Namen enthält. Das einzelne Unterverzeichnis unter output_directory wird also einfach wie folgt abgeflacht:
./1 ./2 ./22 ./3 ./4 ./5 ./6
Das ursprüngliche Eingabeverzeichnis bleibt unverändert.
Verwenden von
find . -type d -exec echo {} \;
Erträge
./1
./1/2
./1/2/3
./1/2/3/4
./1/2/3/4/5
./1/2/3/4/5/6
./1/22
./1/22/3
./1/22/3/4
./1/22/3/4/5
./1/22/3/4/5/6
Ich dachte, das würde funktionieren:
find . -type d -maxdepth 10 -print0 | xargs -0 mkdir -p ~/output_folder
aber leider nicht (mit oder ohne -maxdepth, das ich vorsichtshalber eingefügt habe).
find . -type d -maxdepth 10 -print0 | xargs -0 ls -al
wird korrekt ausgeführt, also ist es fast geschafft?
Dankbar für die Hilfe.
Antwort1
Ich bin mir nicht sicher, ob das das ist, was du willst, da ich nicht genau verstanden habe, warum du das willst, aber du kannst Folgendes versuchen
[user@host ~]$ ls 1
2 22
[user@host ~]$ ls -R 1
1:
2 22
1/2:
3
1/2/3:
4
1/2/3/4:
5
1/2/3/4/5:
6
1/2/3/4/5/6:
1/22:
3
1/22/3:
4
1/22/3/4:
5
1/22/3/4/5:
6
1/22/3/4/5/6:
Versuchen Sie nun, Folgendes auszuführen:
mkdir output_directory; find 1 -type d -exec echo {} \; > dirs.txt; for dir in $(cat dirs.txt); do if [ ! -d output_directory/${dir##*/} ]; then mkdir output_directory/${dir##*/}; fi; done;
[user@host ~]$ ls output_directory/
1 2 22 3 4 5 6
Antwort2
Basierend auf Danilas toller Antwort ist dies meine endgültige Version.
find . -type d -exec echo {} \; > /tmp/tempdirs.txt; \
for dir in $(cat /tmp/tempdirs.txt); do \
if [ ! -d ~/output_directory/${dir##*/} ]; then \
mkdir -p ~/output_directory/${dir##*/}; \
fi; \
done;
Antwort3
Sie können verwenden, basename
um einfach den letzten Teil des Pfads zu erfassen, wie von gefunden find
, die Ergebnisse durch Nullen getrennt auszugeben und xargs
mit replace-str
( -I
) den Basisnamen an das Ausgabeverzeichnis anzuhängen.
find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}