Якщо ви хочете перемістити всі файли всередині ієрархії каталогів до одного каталогу призначення, в 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розширення {}).