Если вы хотите переместить все файлы в иерархии каталогов в один каталог назначения, в 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экспансия {}).