У мене є маса файлів .zip у кількох каталогах:
Fol1/Fol2
Fol3
Fol4/Fol5
Як я можу перенести їх у загальну базову папку?
У мене є маса файлів .zip у кількох каталогах:
Fol1/Fol2
Fol3
Fol4/Fol5
Як я можу перенести їх у загальну базову папку?
Відповіді:
Перейдіть до каталогу вершин дерева, що містить zip-файли ( cd …
), та запустіть
mv **/*.zip /path/to/single/target/directory
Це працює з коробки в zsh. Якщо ваша оболонка є баш, вам потрібно запустити shopt -s globstar
спочатку (ви можете та маєте поставити цю команду у свою ~/.bashrc
). Якщо ваша оболонка є ksh, вам потрібно запустити set -o globstar
спочатку (помістіть її у свій ~/.kshrc
).
Як варіант, використання find
, яке працює скрізь без спеціальної підготовки, але є складнішим:
find . -name '*.zip' -exec mv {} /path/to/single/target/directory \;
Якщо після цього потрібно видалити порожні каталоги, в zsh:
rmdir **/*(/^Fod)
В bash або ksh:
rmdir **/*/
і повторюйте, доки є порожні каталоги, які потрібно видалити. Як варіант, у будь-якій оболонці
find . -depth -type d -empty -exec rmdir {} \;
find
команда вище працювала в bash, але її довелося змінити на find . -name
etc, щоб змусити її працювати.
.
неявний для пошуку GNU, але не для інших, я додав це явно.
Якщо ви використовуєте bash версії 4 або вище або zsh, ви також можете використовувати рекурсивний глобулінг:
mv **/*.zip /path/to/move/zip/files/to
Це перемістить ТІЛЬКИ файли, а не їх відносні шляхи, тому можуть виникнути зіткнення.
Це безпечно під час переміщення даних та без помилок, що підтримує більшість дистрибутивів незалежно від версій. Ця команда буде сканувати підкаталоги, а потім переміщувати або копіювати у ваш новий каталог призначення.
find . -name *.flac -exec mv '{}' "./flac/" ";"
*.flac
будь-що, як *.zip
у вашому випадку. Або *.doc
просто будь-яке розширення працює.mv
це команда переміщення файлів, або ви можете використовувати cp
для копіювання даних замість переміщення../flac/
- це каталог призначення, до якого я хочу перемістити всі файли FLAC. Ви також можете дати йому повний шлях, як/home/myid/flac/
Повний приклад. (В даному випадку, є багато підкаталогів з ім'ям музики художника в /home/myid/Music/
і потім FLAC файли все більш різний рівень підкаталогів. Так як мені не потрібен художник папка , але хоче мати все FLAC файлів в один каталог на/home/myid/Music/flac/
cd /home/myid/Music
mkdir flac
find . -name *.flac -exec mv '{}' "./flac/" ";"
cd flac
ls
Тоді він покаже всі файли FLAC.
;
?
Як баш-хак, ви можете використовувати силу tar
:
(cd origin/;find . -exec file --mime-type "{}" \;|grep "application/zip"|cut -d ':' -f 1|xargs tar cf -)|(cd target/; tar xf -) && rm -fr origin/
Перевага полягає в тому, що він не залежить від розширень файлів, оскільки він використовує file
команду для вибору файлів для переміщення і зберігає структуру каталогів, але він не працює з шляхами, що містять пробіли.
Останнє rm
є лише для того, щоб видалити оригінальні файли (оскільки @InquilineKea каже, що він не хвилює оригінальну папку в коментарі).
Звичайно, це особливо підходить, якщо походження / та цілі / папки знаходяться на різних дисках. В іншому випадку інші запропоновані рішення є більш ефективними (навіть якщо вони покладаються на конвенції про іменування, а не на file
зміст).
Якщо припустити, що у вас є версії GNU find and mv, наступні будуть ефективнішими, ніж існуючі відповіді на основі знахідки:
find . -name '*.zip' -exec mv --target-directory='/path/to/outputdir' '{}' +
Використання a +
в кінці find -exec означає, що список файлів буде переданий команді mv, а не виконувати одну команду mv на знайдений файл. Однак обмеженням цього є те, що ви можете розміщувати '{}' лише в кінці команди, що вимагає використання опції mv --target-каталог, і наскільки я знаю, це GNU-ism.