Como eu combina centenas de pastas usando a linha de comando

2

Eu tenho 535 pastas ( recup_dir.1 , recup_dir.2 , ..., recup_dir.535 ) e quero mesclar (combinar?) o conteúdo dessas pastas em uma única pasta (digamos que uma pasta chamada recup_dir ). Alguns arquivos podem ter nomes idênticos (como img.jpg ), eles não devem sobrescrever os existentes (em vez disso, eles devem ser renomeados para algo como img1.jpg , img2.jpg e assim por diante).

Existe uma maneira de fazer isso usando a linha de comando?

    
por Totally Not Julius 06.09.2014 / 20:47

2 respostas

4

O script abaixo move todos os arquivos de um diretório, contendo suas 535 pastas, (recursivamente) em outro (único) diretório, mantendo o nome do arquivo original.

Em caso de duplicatas

(Apenas) no caso de nomes duplicados, os arquivos serão renomeados para duplicate_1_[filename] , duplicate_2_[filename] etc.

Como usar

Copie o script abaixo em um arquivo vazio, salve-o como rearrange.py , defina os caminhos corretos para a origem e o destino (diretórios) e execute-o por:

python rearrange.py

O script:

#!/usr/bin/env python

import os
import shutil

# --------------------------------------------------------
reorg_dir = "/path/to/sourcedirectory"
target_dir = "/path/to/destination" 
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        n = 1; name_orig = name
        while os.path.exists(target_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
        newfile = target_dir+"/"+name; shutil.move(subject, newfile)

Para o terminal (gnome-) - funcionalidade "arrastar e soltar":

Use a versão abaixo, salve-a como descrito acima (mas não mude nada) e torne-a executável. Para usá-lo, abra uma janela de terminal, arraste o script sobre a janela do terminal e, em seguida, o diretório de origem, o último destino. O comando que você verá no seu terminal:

rearrange.py /path/to/source /path/to/destination

Pressione para retornar e pronto.

O script:

#!/usr/bin/env python

import os
import shutil
import sys
# --------------------------------------------------------
reorg_dir = sys.argv[1]
target_dir = sys.argv[2]
# ---------------------------------------------------------
for root, dirs, files in os.walk(reorg_dir):
    for name in files:
        subject = root+"/"+name
        n = 1; name_orig = name
        while os.path.exists(target_dir+"/"+name):
            name = "duplicate_"+str(n)+"_"+name_orig; n = n+1
        newfile = target_dir+"/"+name; shutil.move(subject, newfile)

Copiar em vez de mover

Se você quiser manter seu diretório atual intocado e apenas copiar os arquivos em um novo diretório, simplesmente substitua a última (seção de) linha:

substituir:

shutil.move(subject, newfile)

por:

shutil.copy(subject, newfile)
    
por Jacob Vlijm 06.09.2014 / 21:17
3

sudo cp -r --backup=t recup_dir.*/* recup_dir

este comando copia o conteúdo de toda a pasta 535 para recup_dir e renomeia os arquivos existentes para file.~1~ file.~2~ ..

a pasta 535 e seu conteúdo ainda existirão, se você quiser excluí-los após a cópia, basta adicionar && sudo rm -rf recup_dir.* após o primeiro comando, assim será:

sudo cp -r --backup=t recup_dir.*/* recup_dir && sudo rm -rf recup_dir.

    
por younes zeboudj 06.09.2014 / 21:19