mv arquivos com | xargs

9

Eu só estou tentando mover um monte de arquivos (não symlinks) da minha pasta / etc / apache / sites-enabled para a pasta / etc / apache / sites-available com o seguinte:

/etc/apache2/sites-enabled$ find . -maxdepth 1 -type f | xargs mv {} ../sites-available/

mas eu sou ubuntu n00b e estou recebendo este erro:

mv: target './real-file' is not a directory

onde 'real-file' é um arquivo de teste que eu configurei no meu ambiente de desenvolvimento. Estou tentando arrumar a bagunça de outra pessoa em um servidor de produção; -)

    
por Rob 23.06.2014 / 10:17

3 respostas

17

Você pode tentar a opção -exec com o comando find ,

/etc/apache2/sites-enabled$ sudo find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \;

Para mover arquivos de propriedade do root, você precisa de sudo permissions.

Se você quiser usar o comando xargs , adicione a opção -I a ele.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
    
por Avinash Raj 23.06.2014 / 10:22
2

O ideal é que você use -print0 com find, então nomes de arquivos com espaços não estragam tudo.

Por exemplo isso deve funcionar:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
    
por David Goodwin 23.06.2014 / 18:05
0

você também pode usar outra maneira de realizar o mesmo, mas com um desempenho extra :

find . -maxdepth 1 -type f -exec mv {} /etc/apache2/sites-available \+

Observe que ele termina com \+ , o que significa que o comando find obterá a saída e expandirá para {} fazendo o que você deseja, evitando assim as duas opções ( \; = para cada entrada AND piping em um novo comando xargs )

Aqui está a explicação (você também pode verificar o manual man find )

  

-exec command {} +                 Esta variante da ação -exec executa o comando especificado nos arquivos selecionados, mas o comando                 A linha é construída anexando cada nome de arquivo selecionado no final; o número total de invocações de                 o comando será muito menor que o número de arquivos correspondentes. A linha de comando é construída em muito                 da mesma forma que xargs constrói suas linhas de comando. Apenas uma instância de ‘{}’ é permitida dentro do                 comando. O comando é executado no diretório inicial.

    
por Raul Gonzales 05.04.2018 / 11:57