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
shell
command-line
file-management
Pedro Gonzalez
fonte
fonte
t
poderia ser para "target"?-t
permita especificar o destino primeiro. a partir damv
página de manual:-t, --target-directory=DIRECTORY
move all SOURCE arguments into DIRECTORY
Observe que esse comando substituirá todos os arquivos com o mesmo nome. Você pode usar isso para ser solicitado antes de substituir:
Explicação
-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 tornamv
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:
fonte
-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 builtinmv
:Ou use
zargs
para dividir a lista em partes gerenciáveis:Com
ksh93
:Com o GNU
xargs
e com o GNUmv
com um shell em queprintf
está embutido (a maioria,mksh
sendo a exceção notável):fonte
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
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)fonte
find
. Apenas o suficienteecho
ouprintf
find
não resolva o problema, mas resolvaxargs
.