Como mover todos os arquivos dentro das subpastas atuais até aqui

8

Eu também tenho 50 pastas com algumas subpastas, com mais de 1.000 arquivos de áudio no total. Eu preciso remover todas as subpastas e colocar todos os arquivos no nível atual. Tentei mv */* ./ mas reclamações: lista de argumentos muito longa

    
por Pedro Gonzalez 02.02.2015 / 12:44

4 respostas

7

Eu assumo que a extensão dos seus arquivos de áudio é .mp3

find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +

Notas:

  • Substitua .mp3 pela extensão de seus arquivos de áudio

  • Substitua <AudioParentFolderPath> pela pasta pai que contenha suas subpastas.

  • Substitua <YourTargetFolder> pelo caminho da pasta em que você precisa colocar todos os arquivos.

  • Se os arquivos de reboque de diferentes subpastas tiverem o mesmo nome , apenas um será movido.

edit: Como Costas disse:   "A opção -i torna mv interativo, ele avisa antes de sobrescrever os arquivos existentes"

    
por 02.02.2015 / 13:01
4
find . -type f -mindepth 2 -exec mv -t ./ {} +

Observe que esse comando sobrescreverá qualquer arquivo com o mesmo nome. Você pode usar isso para ser avisado antes de sobrescrever:

find . -type f -mindepth 2 -exec mv -it ./ {} +

Explicação

  • -type f : só encontra arquivos regulares.
  • -mindepth 2 : localize apenas arquivos em subdiretórios.
  • -exec mv -it ./ {} : o -exec significa "execute este comando em todos os arquivos encontrados". O {} será substituído pelos nomes dos arquivos. A opção -i torna mv interactive, solicitará antes de sobrescrever os arquivos existentes e o -t definirá o diretório de destino como ./ .
  • + : coloca os arquivos juntos (em uma linha de argumento) tantos quanto o shell pode operar com comando para invocar o comando comando vezes mínimas (não uma por uma mas uma para várias) .

Em relação a exclusões de pastas vazias, você pode usar a mesma receita:

find . -type d -empty -delete
    
por 02.02.2015 / 12:53
2

Sim, esse é um limite no tamanho acumulado de argumentos e ambiente passado para a chamada de sistema execve() ao executar um comando externo.

Com zsh , você pode usar seu mv incorporado:

zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .

Ou use zargs para dividir a lista em partes gerenciáveis:

autoload zargs
zargs -Ifiles ./*/* -- mv files .

com ksh93 :

command -x mv ./*/* .

Com o GNU xargs e com o GNU mv com um shell no qual printf está embutido (a maioria, mksh sendo a exceção notável):

printf '%s
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
' ./*/* | xargs -r0 mv -t .
    
por 02.02.2015 / 13:17
0

Uma solução bastante portátil poderia ser:

encontre todos os arquivos em todas as subpastas e mova-os no diretório atual

find ./*/ -type f -print | xargs mv -i "{}" ./

Você pode adicionar um | egrep "\.au$|\.mp3$|\.ac3$" entre para garantir que os arquivos encontrados sejam arquivos com extensão de áudio (adicione quantas extensões forem necessárias para cobrir todo o tipo, eu apenas forneço 3 comuns)

    
por 02.02.2015 / 16:07