Como mover arquivos de subdiretórios aninhados para outra pasta no ubuntu? (Tentando retirar muitas subpastas)

36

Como 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.

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

Socorro?

Chris
fonte

Respostas:

48

Há uma ótima resposta no askubuntu-QA .

Para fazer isso, abra um terminal e execute este comando:

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

Ele moverá todos os arquivos e pastas da pasta Downloads para a pasta Vídeos.


Para mover todos os arquivos, mas não as pastas:

Porém, se você estiver interessado em mover todos os arquivos (mas não as pastas) da pasta Downloads para a pasta Vídeos, use este comando

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

Para mover apenas arquivos das pastas de Download, mas não das subpastas:

Se você deseja mover todos os arquivos da pasta Downloads, mas não arquivos dentro das pastas da pasta Download, use este comando:

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

aqui, a -maxdepthopção especifica o quão profundo o find deve tentar, 1significa apenas o diretório especificado no comando find. Você pode tentar usar 2, 3também para teste.

Veja a página de manual do Ubuntu para uma explicação detalhada.

Fonte

Christian Wörz
fonte
Se o que eu quero fazer é copiar todos os arquivos para a pasta, basta alterar mv para cp? Eu sou novo no Linux
Neoryder
13

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/diruso do comando mv. Apenas substitua os diretórios pelos seus. Arquivos com os mesmos nomes serão renomeados automaticamente.

Selecionando arquivos para mover

Se você deseja mover apenas arquivos MP3, adicione a -iname "*.mp3"opção ao findcomando depois -type f.

Comparação com a resposta de c0dev

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

  1. Exceto que mva solução com -exec +não precisa chamar um comando adicional como xargsou parallele entregar os nomes dos arquivos duas vezes.
  2. A outra resposta substituirá silenciosamente os arquivos com o mesmo nome. Aqui, os arquivos serão renomeados automaticamente graças à opção --backup=numbered. Infelizmente, esses backups com sufixo like ~3~estarã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 GNU.
  3. Ao contrário, -print0 -exec command {} +faz parte dos padrões IEEE Std 1003.1 (POSIX), ISO / IEC 9945 e The Single UNIX Specification. Assim, deve ser mais portátil. Consulte IEEE Std 1003.1, edição de 2004 , IEEE Std 1003.1, edição de 2013 e 0000243: adicione -print0 para "localizar" . De qualquer forma, a -topção necessária mvé uma extensão GNU, portanto, todo o comando não é portátil entre os sistemas POSIX.

Nota: No caso findseria capaz de produzir caminhos começando com -(Eu não sei de qualquer implementação de findno momento.) O {}deve ser precedido pelo indicador de fim de opções: --.

pabouk
fonte
Erro: achado: falta argumento para `-exec'
Chris
@ Chris: Você está certo, parece que {}deve ser o último argumento. Corrigido.
Pabouk
@ Chris: Funciona agora como você desejava? Se sim, você provavelmente pode aceitar a resposta para que sua pergunta não apareça como "não resolvida".
Pabouk #
Isto é o que eu estou executando e obtendo erros de diretório não encontrado:
Chris
o que estou executando: clstal @ clap: ~ $ ls 1st script.R Firefox_wallpaper.png part1vidproj zotero gerenciador de PDF Desktop mozilla.pdf Imagens Documentos pai Vídeos clstal @ clap: ~ $ find / source / directory -type f -exec mv -t / destination / directory {} + find: `/ source / directory ': Não existe esse arquivo ou diretório
Chris
2

Infelizmente, não tenho uma reputação suficientemente alta para comentar sobre a solução marcada. No entanto, eu queria alertar outras pessoas sobre um problema que encontrei. É bem amador; no entanto, quando você está fazendo várias coisas, pode não vir à mente a princípio. Espero que ajude os outros.

Problema

Variações da seguinte mensagem foram fornecidas após o início do comando. O comando 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é um pai de /dst(por exemplo /src/../dst/).

Solução

Embora possa haver uma solução melhor, simplesmente movi os arquivos para um diretório temporário fora do meu /srce, em seguida, executei novamente o comando para colocá-los novamente no /src/../dstdiretório em que eu queria que eles terminassem.

MackAltman
fonte
2

Meu one-liner - isso funciona em Macs, mas também deve funcionar em qualquer * nix. Comece no 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

A primeira parte move tudo, de todas as subpastas para a pasta real, de onde você inicia o comando; a segunda parte verifica se os subdiretórios estão vazios (eles devem agora :-) e os exclui para que você obtenha tudo aqui sem subdiretórios.

Arquivo X
fonte
(1) Por favor, explique o que sua resposta faz e quaisquer vantagens que ela tem sobre as outras respostas (que são muito semelhantes). Por favor, não responda nos comentários; edite  sua resposta para torná-la mais clara e completa. (2) Observe que o -notoperador não é padrão, portanto, seu comando é menos portátil que os outros.
7118 Scott
encontrar . -not -type d -print0 | xargs -0J% mv -f%. ; encontrar . -type d -thp -print0 | xargs -0 rm -rf Executei este comando em uma pasta e ele excluiu as subpastas, a pasta em que eu estava e depois fui para a pasta pai. Felizmente, eu estava assistindo meu gerenciador de arquivos e consegui parar o comando, que foi executado em uma pasta de teste.
Será
1

Abra o terminal, CD para a sua pasta de pastas com arquivos e execute find . -mindepth 2 -type f -print -exec mv {} . \; para mover todos os arquivos desses subdiretórios para o atual.

leão
fonte