Qual é a maneira apropriada de fazer “mv ./* ./subdirdir/”? [duplicado]

2

Sob o diretório atual, eu tenho vários arquivos e um diretório. Gostaria de mover todos os arquivos para o subdiretório:

mv ./* subdir/
cannot move ./subdir to a subdirectory of itself...

O aviso é inofensivo, mas faz com que o mv retorne 1, portanto, não é possível determinar se outros arquivos foram movidos.

O cp pode ajudar, mas eu tenho alguns arquivos grandes para mover e não é eficiente o suficiente.

O script parece funcionar também, mas eu prefiro um forro, se houver algum.

    
por Howard 30.06.2015 / 09:33

2 respostas

1

Você pode fazer isso com o find:

$ find -maxdepth 1 -not -name subdir -print0 | xargs -0 mv -t subdir

Onde:

  • -maxdepth 1 restringe a passagem de localização para o diretório atual (não uma opção POSIX, mas, por exemplo, disponível no GNU find )
  • -print0 diz ao find para terminar linhas com 0 bytes - assim, fazer o comando funcionar com nomes de arquivos incomuns (por exemplo, aqueles contendo novas linhas), também não POSIX, mas fornecidos por, e. GNU find
  • -0 diz xargs sobre os 0 bytes - mais uma vez, não POSIX, mas por exemplo compreendido por e. GNU xargs
  • -t instrui mv que o primeiro argumento é o alvo (não o último) - isto é ideal para este caso de uso - como antes, a opção não está em POSIX, mas por exemplo implementado pelo GNU mv
por 30.06.2015 / 09:43
0

Você pode tentar outro formulário mais conciso, assim:

mv 'ls -A |grep -v <subdir>' <subdir>

Aqui os caracteres de barra invertida significam substituição de comandos , ou seja, mv será executado com uma saída do comando colocado em barras invertidas como parte de seus argumentos.

    
por 30.06.2015 / 10:10

Tags