Ответ 1
find folder2 -name '*.*' -exec mv {} folder \;
-exec
запускает любую команду, {}
вставляет найденное имя файла, \;
обозначает конец команды exec.
Если я запустил команду mv folder2/*.* folder
, я получаю слишком длинную ошибку списка аргументов.
Я нахожу пример ls
и rm
, относящийся к этой ошибке, используя find folder2 -name "*.*"
. Но я не могу применить их к mv
.
find folder2 -name '*.*' -exec mv {} folder \;
-exec
запускает любую команду, {}
вставляет найденное имя файла, \;
обозначает конец команды exec.
Другие ответы find
работают, но для большого количества файлов ужасно медленны, так как они выполняют одну команду для каждого файла. Более эффективный подход - либо использовать +
в конце find
, либо использовать xargs
:
# Using find ... -exec +
find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +
# Using xargs
find folder2 -name '*.*' | xargs mv --target-directory=folder
Во-первых, спасибо Карлу ответ. У меня есть только незначительное исправление к этому.
Мой сценарий:
Миллионы папок внутри /source/directory, содержащие подпапки и файлы внутри. Цель состоит в том, чтобы скопировать его, сохраняя ту же структуру каталогов.
Для этого я использую такую команду:
find /source/directory -mindepth 1 -maxdepth 1 -name '*' -exec mv {} /target/directory \;
здесь:
Команды, предложенные в ответах выше, сделали структуру каталогов результатов плоской - и это было не то, что я искал, поэтому решил поделиться своим подходом.
find folder2 -name '*.*' -exec mv \{\} /dest/directory/ \;
find не работает с очень длинными списками файлов, выдает ту же ошибку "Argument list too long". Использование комбинации ls, grep и xargs помогло мне:
$ ls|grep RadF|xargs mv -t ../fd/
Он сделал трюк, переместив около 50000 файлов, где mv и find потерпели неудачу.
Эта однострочная команда должна работать на вас. Да, это довольно медленно, но работает даже с миллионами файлов.
for i in /folder1/*; do mv "$i" /folder2; done
Он переместит все файлы из папки /folder1
в /folder2
.