Copia semplicemente più file contemporaneamente dalla riga di comando
Esistono diversi modi per raggiungere questo obiettivo. Il più semplice che abbia mai visto è usare quanto segue.
cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/
La sintassi utilizza il comando cp seguito dal percorso della directory in cui si trovano i file desiderati con tutti i file che si desidera copiare racchiusi tra parentesi e separati da virgole.
Assicurati di notare che non ci sono spazi tra i file. L'ultima parte del comando, /home/usr/destination/
è la directory in cui si desidera copiare i file.
o se tutti i file hanno lo stesso prefisso ma finali diversi, potresti fare qualcosa del genere:
cp /home/usr/dir/file{1..4} ./
Dove verranno copiati file1, file2, file3 e file4.
Da come hai formulato la domanda, credo che questo sia quello che stai cercando, ma sembra anche che tu stia cercando un comando per leggere da un elenco di file e copiarli tutti in una determinata directory. In tal caso, fammi sapere e modificherò la mia risposta.
Gestire i duplicati con Python
Quindi ho scritto un piccolo script in Python che credo dovrebbe portare a termine il lavoro. Tuttavia, non sono sicuro di quanto tu sia esperto di Python (se versato), quindi proverò a spiegare come usare questo script il meglio che posso e per favore fai tutte le domande su di esso di cui hai bisogno.
import os,sys,shutil
### copies a list of files from source. handles duplicates.
def rename(file_name, dst, num=1):
#splits file name to add number distinction
(file_prefix, exstension) = os.path.splitext(file_name)
renamed = "%s(%d)%s" % (file_prefix,num,exstension)
#checks if renamed file exists. Renames file if it does exist.
if os.path.exists(dst + renamed):
return rename(file_name, dst, num + 1)
else:
return renamed
def copy_files(src,dst,file_list):
for files in file_list:
src_file_path = src + files
dst_file_path = dst + files
if os.path.exists(dst_file_path):
new_file_name = rename(files, dst)
dst_file_path = dst + new_file_name
print "Copying: " + dst_file_path
try:
shutil.copyfile(src_file_path,dst_file_path)
except IOError:
print src_file_path + " does not exist"
raw_input("Please, press enter to continue.")
def read_file(file_name):
f = open(file_name)
#reads each line of file (f), strips out extra whitespace and
#returns list with each line of the file being an element of the list
content = [x.strip() for x in f.readlines()]
f.close()
return content
src = sys.argv[1]
dst = sys.argv[2]
file_with_list = sys.argv[3]
copy_files(src,dst,read_file(file_with_list))
Questo script dovrebbe essere relativamente semplice da usare. Prima di tutto, copia il codice sopra nel programma gedit (dovrebbe essere preinstallato in Ubuntu) o in qualsiasi altro editor di testo.
Al termine, salva il file come move.py nella tua home directory (può essere una qualsiasi directory ma per semplicità di istruzioni, usa semplicemente la home directory) o aggiungi la directory in cui è contenuto il file nel tuo PERCORSO. Quindi cd
nella tua home directory (o in qualunque altra directory in cui hai salvato move.py) dal terminale e digita il seguente comando:
python move.py /path/to/src/ /path/to/dst/ file.txt
Questo dovrebbe copiare tutti i file elencati dalla directory di origine alla directory di destinazione con i duplicati che assumono il formato pic (1) .jpg, pic (2) .jpg e così via.
file.txt dovrebbe essere un file che elenca tutte le immagini che si desidera copiare con ciascuna voce su una riga separata.
Questo script non dovrebbe in alcun modo influire sulla directory di origine, tuttavia assicurati di inserire i percorsi corretti per la directory di origine e di destinazione e il peggio che potrebbe accadere è copiare i file nella directory sbagliata.
Appunti
- Questo script presuppone che tutte le immagini originali siano nella stessa directory. Se vuoi che controlli anche le sottodirectory, lo script dovrà essere modificato.
- Se si digita inavvertitamente un nome file, lo script emetterà l'errore
"file non esiste" e verrà richiesto di "premere Invio" per continuare e lo script continuerà a copiare il resto dell'elenco.
- Non dimenticare il trailing
/
sia sul percorso della
directory di origine che sul percorso della directory di destinazione. Altrimenti lo script ti restituirà un errore.
cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folder
dovep
serve per copiare i permessi delle cartelle.