Também tenho 50 pastas com algumas subpastas, com mais de 1000 arquivos de áudio no total. Preciso remover todas as subpastas e colocar todos os arquivos no nível atual. Tentei, mv */* ./mas reclama: lista de argumentos muito longa
Também tenho 50 pastas com algumas subpastas, com mais de 1000 arquivos de áudio no total. Preciso remover todas as subpastas e colocar todos os arquivos no nível atual. Tentei, mv */* ./mas reclama: lista de argumentos muito longa
Respostas:
Presumo que a extensão dos seus arquivos de áudio seja .mp3
find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +
Substitua .mp3pela extensão dos 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: "O -iswitch torna mvinterativo, ele será solicitado antes de substituir os arquivos existentes"
-tpermita especificar o destino primeiro. a partir da mvpágina de manual: -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
find . -type f -mindepth 2 -exec mv -t ./ {} +
Observe que esse comando substituirá todos os arquivos com o mesmo nome. Você pode usar isso para ser solicitado antes de substituir:
find . -type f -mindepth 2 -exec mv -it ./ {} +
-type f : encontre apenas arquivos regulares.-mindepth 2 : encontre apenas arquivos em subdiretórios.-exec mv -it ./ {}: os -execmeios "execute este comando em todos os arquivos encontrados". O {}será substituído pelos nomes dos arquivos. O -iswitch torna mvinterativo, ele será solicitado antes de substituir os arquivos existentes e -tdefinirá o diretório de destino ./.+: reúne arquivos (em uma linha de argumento), tantos quanto o shell pode operar com o comando para invocar o tempo mínimo de comando (não um por um, mas um a vários).Em relação a exclusões de pastas vazias adicionais, você pode usar a mesma receita:
find . -type d -empty -delete
-type fseleciona apenas arquivos simples, excluindo links simbólicos, pipes nomeados e similares. Para mover todos os arquivos, exceto os diretórios, você pode fazer ! -type d.
-Lo parâmetro
-ié padrão, -té GNU-only (nada a ver com Linux, que é apenas um kernel encontrado em alguns sistemas GNU e não-GNU)
-tnão existe em alguns sistemas (como um AIX não tão antigo) #
find . -type f -mindepth 2 -exec mv {} ./ \;
Sim, esse é um limite para o tamanho cumulativo de argumentos e ambiente passados para a execve()chamada do sistema ao executar um comando externo.
Com zsh, você pode usar seu builtin mv:
zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .
Ou use zargspara dividir a lista em partes gerenciáveis:
autoload zargs
zargs -Ifiles ./*/* -- mv files .
Com ksh93:
command -x mv ./*/* .
Com o GNU xargse com o GNU mvcom um shell em que printfestá embutido (a maioria, mkshsendo a exceção notável):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zshcaso você pode colocar alguns qualificadores glob , por exemplo, (.)ou (^/)após a última *.
Uma solução bastante portátil pode 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$"intermediário para garantir também que os arquivos encontrados sejam arquivos com uma extensão de áudio (adicione quantas extensões forem necessárias para cobrir todo o tipo, apenas forneço três)
find. Apenas o suficiente echoouprintf
findnão resolva o problema, mas resolva xargs.
tpoderia ser para "target"?