Я намагаюся це зробити, і це не працює:
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наприклад)