Как я могу перемещать файлы с помощью 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/

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там, где может быть больше файлов, чем количество аргументов программы, разрешенных вашей оболочкой.


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

0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.