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 .mp3
pela 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 -i
switch torna mv
interativo, ele será solicitado antes de substituir os arquivos existentes"
-t
permita especificar o destino primeiro. a partir da mv
pá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 -exec
meios "execute este comando em todos os arquivos encontrados". O {}
será substituído pelos nomes dos arquivos. O -i
switch torna mv
interativo, ele será solicitado antes de substituir os arquivos existentes e -t
definirá 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 f
seleciona 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
.
-L
o 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)
-t
nã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 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 em que printf
está embutido (a maioria, mksh
sendo a exceção notável):
printf '%s\0' ./*/* | xargs -r0 mv -t .
zsh
caso 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 echo
ouprintf
find
não resolva o problema, mas resolva xargs
.
t
poderia ser para "target"?