Скажите, что у меня есть следующее дерево каталогов
.
├── 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
.zip
архивыfind . -type f -name "*.zip" -exec unzip {} +
find .
– поисковый текущий каталог для-type f
– файлы-name "*.zip"
– чье соответствие имени *.zip
(так заканчивается в .zip
),-exec unzip {} +
– составьте один длинный список всех соответствий и и работайте unzip
на нем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"*/
– удалите каждый подкаталог в в настоящее время обрабатываемом каталоге