Organisieren Sie Verzeichnis b und seine Unterverzeichnisse genauso wie Verzeichnis a, ohne Dateien aus Verzeichnis a zu kopieren oder zu verschieben.

Organisieren Sie Verzeichnis b und seine Unterverzeichnisse genauso wie Verzeichnis a, ohne Dateien aus Verzeichnis a zu kopieren oder zu verschieben.

Ich suche nach einer Möglichkeit, die im Verzeichnis enthaltenen Dateien so zu organisieren, bdass 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 mvBefehlen mit Ausgabe von awkund/oder sedBefehlen angestrebt, wie in den folgenden Bildern.

Modellverzeichnisse vorher wie Errors aund 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 cdavor 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 csollte das Verzeichnis dem Verzeichnis entsprechen, aohne 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, bdass sie der Hierarchie von entsprechen a, ohne etwas von anach 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 findfü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 aersetzt wird durch b,
  • erstellt das Zielverzeichnis ( makedir -pbeschwert sich nicht über bereits vorhandene Verzeichnisse und erstellt auch alle benötigten übergeordneten Verzeichnisse),
  • sucht nach allen Dateien im gleichen bNamen wie die aktuelle und verschiebt sie in das Zielverzeichnis; mv -ifragt vor dem Überschreiben nach, um Datenverlust zu vermeiden, wenn zwei Dateien in unterschiedlichen Unterverzeichnissen bzufällig den gleichen Namen haben.

Anschließend möchten Sie möglicherweise normale Dateien oder Verzeichnisse b(wie d3in 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

verwandte Informationen