Birden fazla dosyayı aynı anda komut satırından kopyala
Bunu başarabilmenin birkaç yolu var. Gördüğüm en kolay aşağıdakileri kullanmak.
cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/
Sözdizimi, cp komutunu ve ardından dizine giden ve parantez içinde sarılmış ve virgüllerle ayrılmış, kopyalamak istediğiniz tüm dosyaların bulunduğu dizinin yolunu kullanır.
Dosyalar arasında boşluk olmadığına dikkat edin. Komutun son kısmı /home/usr/destination/
, dosyaları kopyalamak istediğiniz dizindir.
veya tüm dosyalar aynı önek içeriyorsa ancak farklı sonlar varsa, bunun gibi bir şey yapabilirsiniz:
cp /home/usr/dir/file{1..4} ./
Burada dosya1, dosya2, dosya3 ve dosya4 kopyalanacak.
Soruyu nasıl ifade ettiğinize göre, aradığınız şeyin bu olduğuna inanıyorum, ancak bir dosya listesinden okumak ve hepsini belirli bir dizine kopyalamak için bir komut arıyor olabilirsiniz. Bu durumda, bana bildirin ve cevabımı düzenleyeyim.
Python ile kopyalarla uğraşmak
Bu yüzden işi bitirmesi gerektiğine inandığım küçük bir python senaryosu yazdım. Ancak, python'da ne kadar iyi tereddüt ettiğinizden emin değilim (eğer usta ise) bu betiği en iyi nasıl kullanabileceğimi açıklamaya çalışacağım ve lütfen bu konu hakkında istediğiniz kadar soru soracağım.
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))
Bu betiğin kullanımı nispeten basit olmalıdır. Öncelikle, yukarıdaki kodu program gedit'e (Ubuntu'da önceden yüklenmiş olmalıdır) veya başka bir metin editörüne kopyalayın.
Bu işlem tamamlandıktan sonra dosyayı ev dizininize move.py olarak kaydedin (herhangi bir dizin olabilir ancak kullanım kolaylığı için sadece ev dizinini kullanmanıza izin verir) veya dosyanın PATH'inize bulunduğu dizini ekleyin. Ardından cd
terminalden ana dizininize (ya da herhangi bir dizine taşınan dizine) ve aşağıdaki komutu yazın:
python move.py /path/to/src/ /path/to/dst/ file.txt
Bu, kaynak dizinden listelenen tüm dosyaları, pic (1) .jpg, pic (2) .jpg biçimini alarak kopyalanan hedef dizine kopyalamalıdır.
file.txt , her giriş için kopyalamak istediğiniz tüm resimleri kendi ayrı satırlarında listeleyen bir dosya olmalıdır.
Bu komut dosyası kaynak dizini hiçbir şekilde etkilememelidir, ancak kaynak ve hedef dizine doğru yolları girdiğinizden emin olun ve olabilecek en kötüsü dosyaları yanlış dizine kopyalamanızdır.
notlar
- Bu komut dosyası, orijinal resimlerin hepsinin aynı dizinde olduğunu varsayar. Alt dizinleri de kontrol etmesini istiyorsanız, komut dosyasının değiştirilmesi gerekecektir.
- Yanlışlıkla bir dosya adını yanlış yazarsanız, komut dosyası
"dosya yok" hatasını bildirir ve devam etmek için "enter" tuşuna basmanızı ister ve komut dosyası listenin geri kalanını kopyalamaya devam eder.
/
Hem kaynak
dizinin yolundaki hem de hedef dizinin yolundaki izlemeyi unutmayın . Aksi takdirde, komut dosyası size geri bir hata verecektir.
cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folder
nereyep
klasör iznini kopyalama içindir.