Mover todos os arquivos dos subdiretórios para o diretório atual?

9

Como posso mover os arquivos contidos em todos os subdiretórios para o diretório atual e remover os subdiretórios vazios?

Eu encontrei esta pergunta , mas adaptando a resposta para:

mv * .

não funcionou; Recebi muitos avisos parecidos com:

mv: wil and ./wil are identical

Os arquivos contidos nos subdiretórios têm nomes exclusivos.

    
por Richard 10.11.2011 / 13:02

5 respostas

12

Você também pode usar a opção -mindepth :

find . -type f -mindepth 2 -exec mv -i -- {} . \;

(Juntamente com -maxdepth , você também pode limitar os níveis de hierarquia dos quais coletar os arquivos.)

Eu usei mv -i ("interativo") para fazer mv perguntar antes de sobrescrever arquivos. Com muitos subdiretórios, pode haver conflitos de nome nos quais você gostaria de ser avisado.

A opção -- interrompe o processamento da opção, portanto, mv não se confunde com nomes de arquivos que começam com um hífen.

Limpe todo o grupo de subdiretórios vazios com

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
    
por 01.05.2012 / 13:41
3

Tente isto:

find ./*/* -type f -print0 | xargs -0 -J % mv % .

Mais informações: Tente apenas o find-stamement, ele deve fornecer uma lista com todos os arquivos que você deseja mover (deixe de fora o -print0 ). Exemplo:

probe:test trurl$ find ./*/* -type f
./test_s/test_s_s/testf4
./test_s/test_s_s/testf5
./test_s/testf1
./test_s/testf2
./test_s/testf3
./test_s2/testf6
./test_s2/testf7

com -print0 e xargs agora você está criando uma lista de instruções a serem executadas. O -J % flag significa, insira o elemento list aqui, então mv $FILE . é executado para cada arquivo encontrado.

O acima está trabalhando para os BSD xargs. Se você estiver usando a versão GNU (Linux), use -I % em vez de -J %

    
por 10.11.2011 / 13:23
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
    
por 10.11.2011 / 14:06
-2

1 truque rápido, só funciona se seus arquivos tiverem extensões (com um ponto):

mv *.* subdir/
mv .* subdir/
    
por 25.04.2014 / 02:27
-2

Basta executar este comando: -)

mv **/*.* .

    
por 04.10.2014 / 21:41