Организовать каталог b и его подкаталоги, файлы которых эквивалентны каталогу a, без копирования или перемещения из каталога a

Организовать каталог b и его подкаталоги, файлы которых эквивалентны каталогу a, без копирования или перемещения из каталога a

Я ищу способ организовать файлы, содержащиеся в каталоге, bчтобы сделать его структуру равной структуре каталога a(который содержит те же файлы, что и b, просто организованные по-другому), без копирования или перемещения чего-либо из каталога a. Таким образом, ищите расширенное использование mvкоманды с выводом из awkили/и sedкоманд, как на следующих изображениях.

Модель каталогов до Errors aи без изменений, как 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

Содержимое каталогов Errors cдо и после, по желанию, как 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

Таким образом, каталог cдолжен стать равным каталогу aбез копирования aсодержимого каталога.

решение1

найти, sed, xargs, mkdir:

find a -type d|sed '1d;s/a\///'|xargs -i mkdir -p c/{}

решение2

Предположим для простоты, что ваши исходные данные находятся в каталоге a:

a
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

и что у вас есть каталог b, содержащий те же файлы, что и a, организованные в виде другой структуры каталогов:

b
├── d1
│   └── f3
├── d2
│   ├── f1
│   └── f2
└── d3
    └── f4

Чтобы переупорядочить файлы в иерархии bto match , не копируя ничего из to :aab

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 {} +

Этот не очень эффективный код (он порождает новый findпроцесс для каждого файла в a):

  • ищет каждый обычный файл в a,
  • определяет целевой каталог как родительский каталог файла с aзаменой на b,
  • создает целевой каталог ( makedir -pне жалуется на уже существующие каталоги и также создает все необходимые родительские каталоги),
  • ищет все файлы в каталоге, bназванном как текущий, и перемещает их в целевой каталог; mv -iзапрашивает подтверждение перед перезаписью, чтобы избежать потери данных, если два файла в разных подкаталогах bимеют одинаковое имя.

Затем вы можете захотеть удалить обычные файлы или каталоги b(как d3в нашем примере), которых нет в a:

export orig=a dest=b
find "$dest" \( -type f -o -type d \) -exec sh -c '
    target=$orig${1#$dest}
    [ ! -e "$target" ]
    ' mysh {} \; -delete

Окончательный результат:

b
├── d1
│   ├── f1
│   └── f2
└── d2
    ├── f3
    └── f4

Связанный контент