Я ищу способ организовать файлы, содержащиеся в каталоге, 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
Чтобы переупорядочить файлы в иерархии b
to match , не копируя ничего из to :a
a
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 {} +
Этот не очень эффективный код (он порождает новый 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