попробовал это с ubuntu zsh 5.0.2:
for pdir in */ do cd $pdir for dir in */ do cd $dir mv */*.zip . cd .. done cd .. done
Как я могу найти все файлы определенного типа / имени и скопировать их на уровень выше ? Вот древовидная структура файловой системы:
germany/ | adventure/ | 300x600/ | | | file1.jpg | file2.zip | 400x600/ | file8.jpg file4.zip switzerland/ | adventure/...
Существует много страновых папок, около 20, и файлы .zip не гарантированно имеют 3 уровня глубины. В настоящее время я нахожусь в их родительской папке, countries/
и я хочу найти и скопировать все файлы .zip на один уровень выше, в adventure/
каталог соответствующей страны / папки.
Я старался:
find . -type f -name '*.zip' -exec mv {}/.. \;
но тот с треском провалился. Он перемещал каждый файл на один уровень вверх, затем они снова перемещались на один уровень вверх.
Спасибо!
РЕДАКТИРОВАТЬ: Я немного поиграл с решениями из ответов и прочитал много man
страниц :). Наконец, я принял решение, которое мне понравилось больше всего, так как оно элегантное и не зависит от оболочки.
Что-то я все еще пытаюсь выяснить:
find
как цикл или фигурные скобки считаются списком / массивом в других языках программирования? Значение: он заполняется найденными результатами (т. Е. Строками) одновременно и ТО передается команде под -exec
?mv/cp
перейти на -n уровней [вверх / вниз]?попробовал это с ubuntu zsh 5.0.2:
for pdir in */ do cd $pdir for dir in */ do cd $dir mv */*.zip . cd .. done cd .. done
Вы можете сделать его независимым от оболочки и объединить его в одну find
команду:
find . -type f -name '*.zip' -exec \ sh -c 'echo cp -- "$0" "$(dirname "$0")"/..' {} \;
Удалите, echo
когда вы уверены, что он делает то, что вы хотите.
Используйте, find
чтобы найти файлы. Запустите оболочку с -exec sh -c
, передав найденный файл {}
в качестве первого аргумента этой оболочке. Поэтому в оболочке путь к файлу будет доступен как $0
.
Затем вы можете использовать dirname "$0"
и команду substitution ( $(…)
) для получения родительского каталога файла. Добавить столько, /..
сколько вы хотите пройти выше.
Обратите внимание, что я цитировал имена файлов, чтобы предотвратить неправильное расширение файлов с символами новой строки или пробелами в их имени.
Просто быстрая альтернатива, если реальность так проста, как приведенный пример:
cd germany mv */*/*.zip .
(и там не миллионы файлов)