Как вы переписываете каталоги, разархивируете и перемещаете все?

Предположим, что у меня есть следующее дерево каталогов

. ├── a1 │   └── sub1 │   └── a1.zip └── a2 └── sub2 └── a2.zip

Текущая директория содержит каталоги a1 и a2. Я хочу рекурсивно искать, находить и извлекать все zip-файлы и перемещать все до a1 и a2 соответственно. Состояние цели:

. ├── a1 │   ├── file1 │   └── file2 └── a2 ├── file1 └── file2

Где файлы поступают из zip. Как это сделать? Какие инструменты я должен использовать в терминале для этого?

EDIT

Чтобы быть более конкретным, я упоминаю рекурсию, так как мы не знаем, сколько подкаталогов есть. Это может быть:

. ├── a1 │   └── sub1 │   └── sub... │   └── a1.zip │   └── text1.txt └── a2 └── sub2    └── sub...    └── a2.zip    └── text2.txt

Цель:

. ├── a1 │   ├── file1_unzipped │   └── text1.txt └── a2 ├── file1_unzipped └── text2.txt
3
задан 5 October 2017 в 19:07

3 ответа

1. Распакуйте все .zip архивы
find . -type f -name "*.zip" -exec unzip {} +

Пояснения

find . - найдите текущий каталог для -type f - файлов -name "*.zip" - чье имя соответствует *.zip (так заканчивается в .zip), -exec unzip {} + - составить один длинный список всех совпадений и запустить unzip на нем

2. Переместите все файлы с нижних уровней на один уровень под текущим

for i in */; do find "$i" -type f -exec mv {} "$i" \; && rm -r "$i"*/; done

Объяснения

find . - найдите текущий каталог для find "$i" -type f - поиск все файлы в текущем обрабатываемом каталоге и ниже -type f - файлы && выполняют следующие действия только в том случае, если предыдущая команда успешно завершена -name "*.zip" - имя которой соответствует *.zip (поэтому заканчивается в .zip),
5
ответ дан 22 May 2018 в 17:49
  • 1
    На самом деле, в подкаталогах есть сами подкаталоги, следовательно, рекурсия. Оптимальное решение будет использовать find один раз для a1, извлечь .zip в том же месте, где оно расположено, и переместить все в этом месте до a1. Затем повторите то же самое для a2. Как мне это сделать? – vega 5 October 2017 в 18:34
  • 2
    см. мои правки. Благодаря! – vega 5 October 2017 в 19:07
[D0] 1. Распакуйте все .zip архивы find . -type f -name "*.zip" -exec unzip {} +

Пояснения

find . - найдите текущий каталог для -type f - файлов -name "*.zip" - чье имя соответствует *.zip (так заканчивается в .zip), -exec unzip {} + - составить один длинный список всех совпадений и запустить unzip на нем

2. Переместите все файлы с нижних уровней на один уровень под текущим

for i in */; do find "$i" -type f -exec mv {} "$i" \; && rm -r "$i"*/; done

Объяснения

find . - найдите текущий каталог для find "$i" -type f - поиск все файлы в текущем обрабатываемом каталоге и ниже -type f - файлы && выполняют следующие действия только в том случае, если предыдущая команда успешно завершена -name "*.zip" - имя которой соответствует *.zip (поэтому заканчивается в .zip),
5
ответ дан 18 July 2018 в 05:43
[D0] 1. Распакуйте все .zip архивы find . -type f -name "*.zip" -exec unzip {} +

Пояснения

find . - найдите текущий каталог для -type f - файлов -name "*.zip" - чье имя соответствует *.zip (так заканчивается в .zip), -exec unzip {} + - составить один длинный список всех совпадений и запустить unzip на нем

2. Переместите все файлы с нижних уровней на один уровень под текущим

for i in */; do find "$i" -type f -exec mv {} "$i" \; && rm -r "$i"*/; done

Объяснения

find . - найдите текущий каталог для find "$i" -type f - поиск все файлы в текущем обрабатываемом каталоге и ниже -type f - файлы && выполняют следующие действия только в том случае, если предыдущая команда успешно завершена -name "*.zip" - имя которой соответствует *.zip (поэтому заканчивается в .zip),
5
ответ дан 24 July 2018 в 18:25

Другие вопросы по тегам:

Похожие вопросы: