Mv файлы с | xargs

18

Я просто пытаюсь переместить группу файлов (не символических ссылок) из моей папки / etc / apache / sites-enabled в папку / etc / apache / sites-available с помощью следующего:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

но я Ubuntu N00B и получаю эту ошибку:

mv: target `./real-file' is not a directory

где 'real-file' - это тестовый файл, который я настроил в своей среде разработки. Я пытаюсь навести порядок в чужом беспорядке на рабочем сервере ;-)

обкрадывать
источник

Ответы:

27

Вы можете попробовать -execвариант с findкомандой,

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

Для перемещения файлов, принадлежащих пользователю root, вам необходимы sudoразрешения.

Если вы хотите использовать xargsкоманду, добавьте -Iк ней опцию.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
Авинаш Радж
источник
7

В идеале вы должны использовать -print0 с find, чтобы имена файлов с пробелами не мешали.

Например, это должно работать:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
Дэвид Гудвин
источник
0

Вы также можете использовать другой способ выполнить то же самое, но с дополнительной производительностью :

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

Обратите внимание, что он заканчивается тем, \+что для команды find можно получить выходные данные и перейти к {}выполнению того, что вы хотите, таким образом вы избегаете двух опций ( \;= для каждой записи И добавление в новую команду xargs)

Вот объяснение (вы также можете проверить руководство man find)

-exec command {} + Этот вариант действия -exec запускает указанную команду для выбранных файлов, но командная строка создается путем добавления каждого выбранного имени файла в конце; общее количество вызовов команды будет намного меньше, чем количество совпавших файлов. Командная строка строится во многом так же, как xargs создает свои командные строки. Только один экземпляр '{}' разрешен в команде. Команда выполняется в начальном каталоге.

gonzalesraul
источник