Я намагаюся це зробити, і це не працює:
ls file_* | xargs mv {} temp/
Якісь ідеї?
Я намагаюся це зробити, і це не працює:
ls file_* | xargs mv {} temp/
Якісь ідеї?
Відповіді:
В ОС X:
ls file_* | xargs -J {} mv {} temp/
У Linux:
ls file_* | xargs -i {} mv {} temp/
/
кінець в кінці не є обов'язковим. Ви можете включити його, якщо хочете, але це не обов'язково.
-i
(або -J
) вкажіть маркер, який буде замінено вхідними аргументами, замість того, щоб вони були проставлені в кінці. man xargs
-i{}
, без пробілу. Або скажіть -I {}
.
-i
, він замінюється. ls file_* | xargs -iFOO mv FOO temp/
працює точно так само.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
краще, ніж ls
там, де може бути більше файлів, ніж кількість програмних аргументів, дозволених вашою оболонкою.
file_*
файли в поточному каталозі, тоді як find
(без додаткових опцій) буде здійснено пошук у всьому дереві каталогів під поточним каталогом.
mv
це не байдуже, чи обробляєте ви файли разом або окремо, деякі інші можливості можуть бути використані.
Як запропонував @ 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
Іншим рішенням може бути:
for f in file_* ; do
mv $f temp/$f
done
Недоліком є те, що він формує новий mv
процес для кожного файлу.
xargs -n10
наприклад)