Ich suche nach einer Möglichkeit, die im Verzeichnis enthaltenen Dateien so zu organisieren, b
dass ihre Struktur der des Verzeichnisses entspricht a
(das dieselben Dateien wie enthält b
, nur anders angeordnet), ohne dass etwas aus dem Verzeichnis kopiert oder verschoben werden muss a
. Auf diese Weise wird eine erweiterte Verwendung von mv
Befehlen mit Ausgabe von awk
und/oder sed
Befehlen angestrebt, wie in den folgenden Bildern.
Modellverzeichnisse vorher wie Errors a
und ohne Änderungen wie Errors b
:
. .
└── Errors a └── Errors b
├── Eltendorf ├── Eltendorf
│ ├── 2013 March 09.txt │ ├── 2013 March 09.txt
│ ├── 2014 November 07.txt │ ├── 2014 November 07.txt
│ ├── 2016 August 03.txt │ ├── 2016 August 03.txt
│ └── 2017 October 02.txt │ └── 2017 October 02.txt
├── Gettendorf ├── Gettendorf
│ ├── 2011 August 05.txt │ ├── 2011 August 05.txt
│ ├── 2014 October 02.txt │ ├── 2014 October 02.txt
│ ├── 2014 October 09.txt │ ├── 2014 October 09.txt
│ └── 2015 November 08.txt │ └── 2015 November 08.txt
├── Krensdorf ├── Krensdorf
│ ├── 2010 August 04.txt │ ├── 2010 August 04.txt
│ ├── 2010 November 04.txt │ ├── 2010 November 04.txt
│ └── 2012 August 09.txt │ └── 2012 August 09.txt
└── Ritzing └── Ritzing
├── 2013 March 01.txt ├── 2013 March 01.txt
├── 2013 March 02.txt ├── 2013 March 02.txt
├── 2013 March 03.txt ├── 2013 March 03.txt
└── 2018 November 02.txt └── 2018 November 02.txt
Inhaltsverzeichnisse Errors c
davor und danach nach Wunsch als Errors d
:
. .
└── Errors c └── Errors d
├── Eltendorf ├── Eltendorf
│ ├── 2010 November 04.txt │ ├── 2013 March 09.txt
│ ├── 2013 March 02.txt │ ├── 2014 November 07.txt
│ ├── 2014 November 07.txt │ ├── 2016 August 03.txt
│ └── 2014 October 09.txt │ └── 2017 October 02.txt
├── Gettendorf ├── Gettendorf
│ ├── 2012 August 09.txt │ ├── 2011 August 05.txt
│ ├── 2013 March 03.txt │ ├── 2014 October 02.txt
│ ├── 2014 October 02.txt │ ├── 2014 October 09.txt
│ └── 2017 October 02.txt │ └── 2015 November 08.txt
├── Krensdorf ├── Krensdorf
│ ├── 2010 August 04.txt │ ├── 2010 August 04.txt
│ ├── 2013 March 01.txt │ ├── 2010 November 04.txt
│ ├── 2015 November 08.txt │ └── 2012 August 09.txt
│ └── 2018 November 02.txt └── Ritzing
└── Ritzing ├── 2013 March 01.txt
├── 2011 August 05.txt ├── 2013 March 02.txt
├── 2013 March 09.txt ├── 2013 March 03.txt
└── 2016 August 03.txt └── 2018 November 02.txt
Auf diese Weise c
sollte das Verzeichnis dem Verzeichnis entsprechen, a
ohne dass der Verzeichnisinhalt kopiert wird a
.
Antwort1
finden, sed, xargs, mkdir:
find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}
Antwort2
Nehmen wir der Einfachheit halber an, dass sich Ihre Originaldaten im Verzeichnis befinden a
:
a
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4
und dass Sie über ein Verzeichnis verfügen b
, das dieselben Dateien wie enthält a
, allerdings in einer anderen Verzeichnisstruktur organisiert:
b
├── d1
│ └── f3
├── d2
│ ├── f1
│ └── f2
└── d3
└── f4
So ordnen Sie die Dateien so an, b
dass sie der Hierarchie von entsprechen a
, ohne etwas von a
nach zu kopieren b
:
export orig=a dest=b
find "$orig" -type f -exec sh -c '
for file; do
target=$dest${file#$orig}
target=${target%/*}
mkdir -p -- "$target"
find "$dest" -type f -name "${file##*/}" \
-exec mv -i -- \{\} "$target/" \;
done
' mysh {} +
Dieser nicht wirklich effiziente Code (er erzeugt find
für jede Datei in einen neuen Prozess a
):
- sucht nach jeder regulären Datei in
a
, - definiert ein Zielverzeichnis als übergeordnetes Verzeichnis der Datei, wobei
a
ersetzt wird durchb
, - erstellt das Zielverzeichnis (
makedir -p
beschwert sich nicht über bereits vorhandene Verzeichnisse und erstellt auch alle benötigten übergeordneten Verzeichnisse), - sucht nach allen Dateien im gleichen
b
Namen wie die aktuelle und verschiebt sie in das Zielverzeichnis;mv -i
fragt vor dem Überschreiben nach, um Datenverlust zu vermeiden, wenn zwei Dateien in unterschiedlichen Unterverzeichnissenb
zufällig den gleichen Namen haben.
Anschließend möchten Sie möglicherweise normale Dateien oder Verzeichnisse b
(wie d3
in unserem Beispiel) entfernen, die sich nicht in folgendem Verzeichnis befinden a
:
export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
target=$orig${1#$dest}
[ ! -e "$target" ]
' mysh {} \; -delete
Das Endergebnis ist:
b
├── d1
│ ├── f1
│ └── f2
└── d2
├── f3
└── f4