Как я могу перемещать файлы с помощью xargs в Linux?

24

Я пытаюсь это, и это не работает:

ls file_* | xargs mv {} temp/

Любые идеи?

Питер Мортенсен
источник
Кто-нибудь с многофайловой версией этого? ( xargs -n10например)
Герт ван ден Берг

Ответы:

31

На OS X:

ls file_* | xargs -J {} mv {} temp/

В Linux:

ls file_* | xargs -i {} mv {} temp/
Amadan
источник
1
В Linux, по крайней мере, /в конце необязательно. Вы можете включить его, если хотите, но это не обязательно.
Скотт
4
@ user1953864: -i(или -J) укажите токен, который будет заменен входящими аргументами, а не просто прикреплен к концу. man xargs
Амадан
14
Вы , возможно , нужно сказать -i{}, без пробела. Или сказать -I {}.
Скотт
1
Я заметил, что использование «%» вместо «{}» также работает - что означает% и что означает {}? Пример: ls file_ * | xargs -I% mv% temp /
dmonopoly
3
@dmonopoly: Они ничего не значат . Каким бы ни был параметр -i, он заменяется. ls file_* | xargs -iFOO mv FOO temp/работает точно так же.
Амадан
8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findлучше, чем lsтам, где может быть больше файлов, чем количество аргументов программы, разрешенных вашей оболочкой.

Давид-SkyMesh
источник
2
Обратите внимание, что вопрос предполагает желание обрабатывать только file_*файлы в текущем каталоге, в то время как find(без дополнительных опций) будет выполняться поиск по всему дереву каталогов в текущем каталоге.
Скотт
1
Да, верно. Добавьте, -maxdepth 0чтобы предотвратить это.
«лучше» субъективно. Более мощный, более сложный и медленный; и хотя mvне имеет значения, обрабатываете ли вы файлы вместе или по отдельности, некоторые другие возможности могут.
Амадан
Отредактировано (добавлено -maxdepth 0)
8

Используйте -t "указать целевой каталог" на mv, он должен работать при перемещении файлов * в каталог назначения / temp

например: - #ls -l file * | xargs mv -t / temp

Ратееш
источник
4

В соответствии с предложением @ user1953864: { -i, -J} укажите токен, который будет заменен входящими аргументами.

Например ls:

something.java  exampleModel.java  NewsQueryImpl.java  readme someDirectory/

Затем переместить все файлы Java в папку someDirectory с помощью xargsследующего:

В линуксе

ls *.java | xargs -i mv {} someDirectory/

На MacOS

ls *.java | xargs -J mv {} someDirectory
MDK
источник
0

Другое решение может быть:

 for f in file_* ; do
   mv $f temp/$f
 done

Недостатком является то, что он создает новый mvпроцесс для каждого файла.

Василий Старынкевич
источник