Como faço para mover arquivos de subdiretórios aninhados para outra pasta no Ubuntu? (Tentando retirar muitas subpastas)

29

Como eu movo arquivos e não diretórios para outra pasta / pasta pai?

Eu tenho uma estrutura de pastas extremamente feia, com alguns arquivos .mp3 enterrados em 6 níveis em uma subpasta.

Eu quero acabar com todos os arquivos (principalmente .mp3, mas não todos) em um diretório, sem subdiretórios, usando o Ubuntu.

Ajuda?

    
por Chris 13.10.2013 / 00:31

4 respostas

39

Existe uma ótima resposta no askubuntu-QA .

To do so, Open a terminal and execute this command:

mv  -v ~/Downloads/* ~/Videos/

It will move all the files and folders from Downloads folder to Videos folder.


To Move all files, but not folders:

But, If you are interested to move all files (but not folders) from Downloads folder to Videos folder, use this command

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

To move only files from the Download folders, but not from sub-folders:

If you want to move all files from the Downloads folder, but not any files within folders in the Download folder, use this command:

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

here, -maxdepth option specifies how deep find should try, 1 means, only the directory specified in the find command. You can try using 2, 3 also to test.

See the Ubuntu find manpage for a detailed explanation.

Fonte

    
por 13.10.2013 / 01:25
8

Solução

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

O comando encontrará todos os arquivos regulares em /src/dir (incluindo todos os subdiretórios) e os moverá para o /dst/dir usando o comando mv . Apenas substitua os diretórios pelo seu. Arquivos com os mesmos nomes serão renomeados automaticamente.

Selecionando arquivos para mover

Se você deseja mover apenas arquivos MP3, adicione a opção -iname "*.mp3" ao comando find após -type f .

Comparação com a resposta de c0dev

Apenas o segundo comando na resposta do c0dev responde à pergunta. Abaixo está como se compara a esta resposta. Os pontos 3. e 4. podem ser resolvidos na outra resposta da mesma forma que aqui.

  1. Exceto mv , a solução com -exec + não precisa chamar um comando adicional como xargs ou parallel e entregar os nomes dos arquivos duas vezes.
  2. A outra resposta substituirá silenciosamente os arquivos com o mesmo nome. Aqui os arquivos serão automaticamente renomeados graças à opção --backup=numbered . Infelizmente, esses backups com sufixo como ~3~ ficarão ocultos na maioria dos arquivos gerenciados por padrão. Infelizmente, mv não permite a alteração do sufixo, mas pode ser facilmente pós-processado por comandos adicionais. Esta é uma extensão do GNU.
  3. Ao contrário de -print0 -exec command {} + , faz parte dos padrões IEEE Std 1003.1 (POSIX), ISO / IEC 9945 e The Single UNIX Specification. Assim, deveria ser mais portátil. Consulte IEEE Std 1003.1, edição 2004 , IEEE Std 1003.1, edição 2013 e 0000243: Adicionar -print0 para "encontrar" . Mas, de qualquer forma, a opção -t requerida de mv é uma extensão GNU, então o comando inteiro não é portável entre sistemas POSIX.

Nota: No caso find seria capaz de produzir caminhos começando com - (eu não sei de nenhuma implementação de find no momento). o {} deve ser precedido pelo fim -de-indicador de opções: -- .

    
por 13.10.2013 / 00:37
2

Infelizmente, não tenho reputação suficiente para comentar sobre a solução marcada. No entanto, eu queria alertar os outros sobre um problema que eu encontrei. É muito amador; no entanto, quando você está fazendo várias coisas, pode não vir à mente no início. Espero que ajude os outros.

Problema

As variações da mensagem a seguir foram fornecidas após o início do comando. O comando então cria vários arquivos.

mv: '/data/share/docs/src/dir/filename.ext' and '/data/share/docs/src/dst/filename.ext' are the same file

Causa

O /src é pai de /dst (por exemplo, /src/../dst/ ).

Solução

Embora possa haver uma solução melhor, eu simplesmente movi os arquivos para um diretório temporário fora do meu /src e, em seguida, rotei o comando para colocá-los de volta dentro do diretório /src/../dst no qual eu queria que eles terminassem. / p>     

por 16.07.2015 / 15:58
0

Meu one-liner - isso funciona em Macs, mas também deve ser feito em qualquer * nix. Comece pelo diretório pai.

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf
    
por 07.10.2018 / 11:52