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

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

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

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

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

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

Править

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

.
├── 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

1 ответ

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

Объяснения

  • for i in */; do …; done – цикл по всем каталогам на текущем уровне
  • find "$i" -type f – ищите все файлы в в настоящее время обрабатываемом каталоге и ниже
  • -exec mv {} "$i" \; – переместите их в в настоящее время обрабатываемый каталог
  • && сделайте следующее только если предыдущая команда, законченная успешно
  • rm -r "$i"*/ – удалите каждый подкаталог в в настоящее время обрабатываемом каталоге
5
ответ дан 1 December 2019 в 15:34

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

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