Como posso mover arquivos com xargs no Linux?


24

Estou tentando isso e não está funcionando:

ls file_* | xargs mv {} temp/

Alguma ideia?


Alguém com uma versão para mover vários arquivos? ( xargs -n10por exemplo)
Gert van den Berg

Respostas:


31

No OS X:

ls file_* | xargs -J {} mv {} temp/

No Linux:

ls file_* | xargs -i {} mv {} temp/

1
No Linux, pelo menos, /o final é opcional. Você pode incluí-lo se quiser, mas não é necessário.
8113 Scott

4
@ user1953864: -i(ou -J) especifique um token que será substituído pelos argumentos recebidos, em vez de apenas serem pregados no final. man xargs
Amadan

14
Você pode precisar dizer -i{}, sem espaço. Ou diga -I {}.
Scott

1
Percebo que usar "%" no lugar de "{}" também funciona - o que% significa e o que {} significa? Exemplo: ls file_ * | xargs -I% mv% temp /
dmonopoly

3
@monopoly: Eles não significam nada. Seja qual for o parâmetro -i, ele está sendo substituído. ls file_* | xargs -iFOO mv FOO temp/funciona exatamente da mesma maneira.
Amadan

8

find . -name "file_*" -maxdepth 0 -exec mv {} temp/ \;

findé melhor do que lsonde pode haver mais arquivos que o número de argumentos do programa permitido pelo seu shell.


2
Observe que a pergunta sugere um desejo de processar apenas os file_*arquivos no diretório atual, enquanto find(sem opções adicionais) pesquisará toda a árvore de diretórios no diretório atual.
8113 Scott

1
Sim, verdade. Adicione -maxdepth 0para evitar isso.

"melhor" é subjetivo. Mais poderoso, mais complexo e mais lento; e embora mvnão se importe se você processa arquivos juntos ou individualmente, alguns outros usos podem.
Amadan

Editado (adicionado -maxdepth 0)

8

Use -t "especifique directoty de destino" no mv, ele deve funcionar movendo arquivos * para o diretório / temp de destino

ex: - arquivo #ls -l * | xargs mv -t / temp


4

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 xargsseria o seguinte:

No Linux

ls *.java | xargs -i mv {} someDirectory/

No MacOS

ls *.java | xargs -J mv {} someDirectory

0

Outra solução pode ser:

 for f in file_* ; do
   mv $f temp/$f
 done

A desvantagem é que ele bifurca um novo mvprocesso para cada arquivo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.