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

13

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

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.

Richard
fonte

Respostas:

22

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

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

( -maxdepthVocê também pode limitar os níveis de hierarquia dos quais coletar os arquivos.)

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

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

Limpe todo o conjunto de subdiretórios vazios com

find . -depth -mindepth 1 -type d -empty -exec rmdir {} \;
Florian Jenn
fonte
Existe também uma maneira de ignorar a pergunta para substituir os arquivos, não substituindo-os?
Filnor 13/08/19
2
Opções para mv:: -n, --no-clobbernão substitui um arquivo existente. Você pode estar interessado -b, --backuptambém.
Florian Jenn
5

Tente o seguinte:

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

Mais informações: Experimente o achado sozinho, 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 -print0e xargsagora você está criando uma lista de instruções a serem executadas. O -J %sinalizador significa, insira o elemento list aqui, para que mv $FILE .seja executado para cada arquivo encontrado.

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

tremer
fonte
0

Bash 4:

shopt -s globstar
for file in **; do [[ -f "$file" ]] && mv "$file" .; done
ata
fonte
-2

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

mv *.* subdir/
mv .* subdir/
Guillermo
fonte
-2

Basta executar este comando :-)

mv **/*.* .

Paul Digi
fonte
11
Isso não encontrará arquivos que não tenham um .nome, não é?
G-Man diz 'Reinstate Monica'