Я пытаюсь это, и это не работает:
ls file_* | xargs mv {} temp/
Любые идеи?
Я пытаюсь это, и это не работает:
ls file_* | xargs mv {} temp/
Любые идеи?
Ответы:
На OS 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
следующего:
В линуксе
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
например)