Come faccio a combinare centinaia di cartelle usando la riga di comando

2

Ho 535 cartelle ( recup_dir.1 , recup_dir.2 , ..., recup_dir.535 ) e voglio unire (combinare?) il contenuto di quelle cartelle in una singola cartella (diciamo una cartella chiamata recup_dir ). Alcuni file potrebbero avere nomi identici (come img.jpg ), non dovrebbero sovrascrivere quelli esistenti (dovrebbero invece essere rinominati in qualcosa come img1.jpg , img2.jpg e così via ...).

C'è un modo per fare questa cosa usando la riga di comando?

    
posta Totally Not Julius 06.09.2014 - 20:47

2 risposte

4

Lo script sotto sposta tutti i file da una directory, contenente le 535 cartelle, (ricorsivamente) in un'altra (singola) directory, mantenendo il loro nome originale.

In caso di duplicati

(Solo) in caso di nomi duplicati, i file verranno rinominati in duplicate_1_[filename] , duplicate_2_[filename] ecc.

Come usare

Copia lo script di seguito in un file vuoto, salvalo come rearrange.py , imposta i percorsi corretti per l'origine e la destinazione (directory) ed eseguilo per:

python rearrange.py

Lo 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)

Per (gnome-) terminal- "trascina e rilascia" la funzionalità:

Usa la versione successiva, salvala come descritto sopra (ma non modificare nulla) e rendila eseguibile. Per usarlo, apri una finestra di terminale, trascina lo script sulla finestra del terminale, quindi sulla directory di origine, ultima sulla destinazione. Il comando che vedrai nel tuo terminale:

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

Premi return e il gioco è fatto.

Lo 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)

Copia anziché spostamento

Se desideri mantenere intatta la tua directory corrente e copia solo copia in una nuova directory, sostituisci semplicemente l'ultima (sezione di) riga:

sostituire:

shutil.move(subject, newfile)

da:

shutil.copy(subject, newfile)
    
risposta data Jacob Vlijm 06.09.2014 - 21:17
3

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

questo comando copierà il contenuto di tutta la cartella 535 in recup_dir e rinominerà i file esistenti in file.~1~ file.~2~ ..

la cartella 535 e il loro contenuto continueranno a esistere, se vuoi eliminarli dopo aver copiato aggiungi solo && sudo rm -rf recup_dir.* dopo il primo comando, quindi assomiglierà a:

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

    
risposta data younes zeboudj 06.09.2014 - 21:19

Leggi altre domande sui tag