Estou tentando isso e não está funcionando:
ls file_* | xargs mv {} temp/
Alguma ideia?
Estou tentando isso e não está funcionando:
ls file_* | xargs mv {} temp/
Alguma ideia?
Respostas:
No OS X:
ls file_* | xargs -J {} mv {} temp/
No Linux:
ls file_* | xargs -i {} mv {} temp/
/
o final é opcional. Você pode incluí-lo se quiser, mas não é necessário.
-i
(ou -J
) especifique um token que será substituído pelos argumentos recebidos, em vez de apenas serem pregados no final. man xargs
-i{}
, sem espaço. Ou diga -I {}
.
-i
, ele está sendo substituído. ls file_* | xargs -iFOO mv FOO temp/
funciona exatamente da mesma maneira.
find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;
find
é melhor do que ls
onde pode haver mais arquivos que o número de argumentos do programa permitido pelo seu shell.
file_*
arquivos no diretório atual, enquanto find
(sem opções adicionais) pesquisará toda a árvore de diretórios no diretório atual.
mv
não se importe se você processa arquivos juntos ou individualmente, alguns outros usos podem.
Conforme sugerido por @ user1953864: { -i
, -J
} especifique um token que será substituído pelos argumentos recebidos.
Por exemplo ls
:
something.java exampleModel.java NewsQueryImpl.java readme someDirectory/
Em seguida, mover todos os arquivos java para a pasta someDirectory xargs
seria o seguinte:
No Linux
ls *.java | xargs -i mv {} someDirectory/
No MacOS
ls *.java | xargs -J mv {} someDirectory
Outra solução pode ser:
for f in file_* ; do
mv $f temp/$f
done
A desvantagem é que ele bifurca um novo mv
processo para cada arquivo.
xargs -n10
por exemplo)