Com ferramentas GNU:
cd that-dir &&
find . -mindepth 2 ! -type d -exec mv -it . {} +
Eu tenho uma grande coleção de arquivos compactados em uma estrutura de diretórios de dois níveis com muitas, muitas, muitas pastas.
Em outras palavras, tenho uma pasta com muitas subpastas nela. Não há subpastas nessas subpastas, no entanto, existem centenas de arquivos nelas.
O que eu gostaria de fazer é mover todos os arquivos dessas subpastas para o diretório que contém as subpastas.
Este é um sistema de recursos limitado, então uma maneira de fazê-lo sem que duas cópias de todos esses arquivos tenham que existir de uma só vez seria incrível ...
Com ferramentas GNU:
cd that-dir &&
find . -mindepth 2 ! -type d -exec mv -it . {} +
Vá para o diretório pai e execute
mv -- */* .
( --
é necessário apenas se houver subdiretórios cujo nome comece com -
)
Se houver arquivos nos subdiretórios que começam com .
(arquivos de ponto) ou subdiretórios cujo nome começa com .
, você precisará movê-los também:
mv -- */* */.[!.]* */..?* .
mv -- .[!.]*/* .[!.]*/.[!.]* .[!.]*/..?* .
mv -- ..?*/* ..?*/.[!.]* ..?*/..?* .
Certifique-se de que não haja conflitos, caso contrário, o último arquivo movido substituirá silenciosamente um arquivo movido anteriormente com o mesmo nome. Passe a opção -i
para mv
(ou seja, mv -i */* .
) para ser solicitado em caso de conflito.
Você pode remover os subdiretórios:
rmdir */
Se você receber um erro informando que a linha de comando é muito longa, terá que fazer isso em várias etapas. A maneira mais fácil é com o comando find
:
find */ -type f -exec mv -i {} . \;
ou um pouco mais rápido:
find */ -type f -exec sh -c 'mv -i -- "$@" "$0"' . {} +
Ainda mais rápido, em um sistema Linux não incorporado:
find . -mindepth 2 -type f -exec mv -it . {} +