So replizieren und vereinfachen Sie die Namen tief verschachtelter Unterverzeichnisse in einem neuen Ordner

So replizieren und vereinfachen Sie die Namen tief verschachtelter Unterverzeichnisse in einem neuen Ordner

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_directoryein 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, basenameum einfach den letzten Teil des Pfads zu erfassen, wie von gefunden find, die Ergebnisse durch Nullen getrennt auszugeben und xargsmit replace-str( -I) den Basisnamen an das Ausgabeverzeichnis anzuhängen.

find . -type d -exec basename -z {} \; |xargs -I {} -0 mkdir output_directory/{}

verwandte Informationen