Если вы хотите переместить все файлы в иерархии каталогов в один каталог назначения, в bash ≥4 (вставьте shopt -s globstar
в свой ~/.bashrc
) или zsh:
mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory
В других оболочках:
mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;
Как читать эту find
команду:
.
: пройти текущий каталог
-name '*.xxx'
: действовать на файлы, имя которых соответствует этому шаблону
-exec … \;
: выполнить эту команду для каждого файла, заменив {}
путь к файлу
Существует более сложная команда, использующая find
это быстрее, если у вас много файлов, так как не нужно вызывать отдельный mv
процесс для каждого файла:
find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +
В +
конце указывается find
вызывать команду для нескольких файлов одновременно. Так find
как имена файлов можно помещать только в конец командной строки, а mv
каталог назначения должен быть последним, мы используем промежуточную оболочку для перестановки аргументов ( "$0"
это первый аргумент оболочки ~/new-directory
и "$@"
последующие аргументы, поступающие из find
экспансия {}
).