Як я можу переміщувати файли з xargs в Linux?


Відповіді:


31

В ОС 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 файл * | xargs mv -t / temp


3

Як запропонував @ user1953864: { -i, -J} вкажіть маркер, який буде замінено вхідними аргументами.

Наприклад ls:

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

Потім перемістити всі файли Java в папку someDirectory з xargsтаким чином:

У Linux

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.