Перемещение большого количества файлов

Если я запустил команду mv folder2/*.* folder, я получаю слишком длинную ошибку списка аргументов.

Я нахожу пример ls и rm, относящийся к этой ошибке, используя find folder2 -name "*.*". Но я не могу применить их к mv.

Ответы

Ответ 1

find folder2 -name '*.*' -exec mv {} folder \;

-exec запускает любую команду, {} вставляет найденное имя файла, \; обозначает конец команды exec.

Ответ 2

Другие ответы find работают, но для большого количества файлов ужасно медленны, так как они выполняют одну команду для каждого файла. Более эффективный подход - либо использовать + в конце find, либо использовать xargs:

# Using find ... -exec +
find folder2 -name '*.*' -exec mv --target-directory=folder '{}' +

# Using xargs
find folder2 -name '*.*' | xargs mv --target-directory=folder

Ответ 3

Во-первых, спасибо Карлу ответ. У меня есть только незначительное исправление к этому.

Мой сценарий:

Миллионы папок внутри /source/directory, содержащие подпапки и файлы внутри. Цель состоит в том, чтобы скопировать его, сохраняя ту же структуру каталогов.

Для этого я использую такую команду:

find /source/directory -mindepth 1 -maxdepth 1 -name '*' -exec mv {} /target/directory \;

здесь:

  • -mindepth 1: убедитесь, что вы не перемещаете корневую папку
  • -maxdepth 1: обеспечивает поиск только детей первого уровня. Поэтому весь его контент тоже будет перемещен, но вам не нужно его искать.

Команды, предложенные в ответах выше, сделали структуру каталогов результатов плоской - и это было не то, что я искал, поэтому решил поделиться своим подходом.

Ответ 4

find folder2 -name '*.*' -exec mv \{\} /dest/directory/ \;

Ответ 5

find не работает с очень длинными списками файлов, выдает ту же ошибку "Argument list too long". Использование комбинации ls, grep и xargs помогло мне:

$ ls|grep RadF|xargs mv -t ../fd/

Он сделал трюк, переместив около 50000 файлов, где mv и find потерпели неудачу.

Ответ 6

Эта однострочная команда должна работать на вас. Да, это довольно медленно, но работает даже с миллионами файлов.

for i in /folder1/*; do mv "$i" /folder2; done

Он переместит все файлы из папки /folder1 в /folder2.