arquivos mv com | xargs

18

Estou apenas tentando mover um monte de arquivos (não links simbólicos) 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 um ubuntu n00b e estou recebendo este erro:

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

onde 'arquivo real' é 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 ;-)

Roubar
fonte

Respostas:

27

Você pode tentar a -execopção com o findcomando

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

Para mover arquivos pertencentes à raiz, você precisa de sudopermissões.

Se você deseja usar o xargscomando, adicione a -Iopção.

find . -maxdepth 1 -type f | sudo xargs -I {} mv {} /etc/apache2/sites-available/
Avinash Raj
fonte
7

Idealmente, você deve usar -print0 com find, para que os nomes de arquivos com espaços não estraguem as coisas.

Por exemplo, isso deve funcionar:

find . -whatever-flags-go-here -print0 | xargs -r0 mv -t target-directory
David Goodwin
fonte
0

você também pode usar outra maneira de executar 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 obtém a saída e se expande para {}fazer o que você deseja, dessa maneira evita as duas opções ( \;= para cada entrada E canaliza para um novo comando xargs)

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

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

gonzalesraul
fonte