Chỉ cần sao chép nhiều tệp cùng một lúc từ dòng lệnh
Có một số cách bạn có thể đạt được điều này. Đơn giản nhất tôi đã thấy là sử dụng sau đây.
cp /home/usr/dir/{file1,file2,file3,file4} /home/usr/destination/
Cú pháp sử dụng lệnh cp theo sau là đường dẫn đến thư mục các tệp mong muốn được đặt trong tất cả các tệp bạn muốn sao chép được đóng gói trong ngoặc và phân tách bằng dấu phẩy.
Đảm bảo lưu ý rằng không có khoảng cách giữa các tệp. Phần cuối cùng của lệnh, /home/usr/destination/
là thư mục bạn muốn sao chép các tệp vào.
hoặc nếu tất cả các tệp có cùng một tiền tố nhưng các kết thúc khác nhau, bạn có thể làm một cái gì đó như thế này:
cp /home/usr/dir/file{1..4} ./
Trong đó file1, file2, file3 và file4 sẽ được sao chép.
Từ cách bạn diễn đạt câu hỏi, tôi tin rằng đây là những gì bạn đang tìm kiếm nhưng cũng có vẻ như bạn đang tìm kiếm một lệnh để đọc từ danh sách các tệp và sao chép tất cả chúng vào một thư mục nhất định. Nếu đó là trường hợp cho tôi biết và tôi sẽ chỉnh sửa câu trả lời của tôi.
Xử lý trùng lặp với trăn
Vì vậy, tôi đã viết một kịch bản python nhỏ mà tôi tin rằng nên hoàn thành công việc. Tuy nhiên, tôi không chắc bạn thành thạo python như thế nào (nếu thông thạo tất cả) vì vậy tôi sẽ cố gắng giải thích cách sử dụng kịch bản này tốt nhất có thể và xin hỏi bao nhiêu câu hỏi về nó khi bạn cần.
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))
Kịch bản này nên tương đối đơn giản để sử dụng. Trước hết, sao chép mã trên vào chương trình gedit (nên được cài đặt sẵn trong Ubuntu) hoặc bất kỳ trình soạn thảo văn bản nào khác.
Sau khi hoàn tất, hãy lưu tệp dưới dạng move.txt trong thư mục chính của bạn (nó có thể là bất kỳ thư mục nào nhưng để dễ hướng dẫn, chỉ cần sử dụng thư mục chính) hoặc thêm thư mục mà tệp được chứa trong PATH của bạn. Sau đó, cd
vào thư mục chính của bạn (hoặc bất kỳ thư mục nào bạn đã lưu move.txt trong) từ thiết bị đầu cuối và nhập lệnh sau:
python move.py /path/to/src/ /path/to/dst/ file.txt
Điều này sẽ sao chép tất cả các tệp được liệt kê từ thư mục nguồn vào thư mục đích với các bản sao lấy định dạng pic (1) .jpg, pic (2) .jpg, v.v.
file.txt phải là một tệp liệt kê tất cả các hình ảnh bạn muốn sao chép với mỗi mục trên dòng riêng biệt của nó.
Không có cách nào tập lệnh này ảnh hưởng đến thư mục nguồn, tuy nhiên chỉ cần đảm bảo nhập đúng đường dẫn đến thư mục nguồn và đích và điều tồi tệ nhất có thể xảy ra là bạn sao chép các tệp vào thư mục sai.
Ghi chú
- Kịch bản này giả định rằng tất cả các hình ảnh gốc nằm trong cùng một thư mục. Nếu bạn muốn nó kiểm tra các thư mục con, kịch bản sẽ cần phải được sửa đổi.
- Nếu bạn vô tình gõ nhầm tên tệp, tập lệnh sẽ phát ra lỗi
"tập tin không tồn tại" và nhắc bạn "nhấn enter" để tiếp tục và tập lệnh sẽ tiếp tục sao chép phần còn lại của danh sách.
- Đừng quên dấu vết
/
trên cả đường dẫn đến
thư mục nguồn và đường dẫn đến thư mục đích. Nếu không, kịch bản sẽ nhổ một lỗi về bạn.
cp -rp /copying/from/{folder1/,folder2/,folder3/} path/to/folder
, nơip
để sao chép quyền thư mục.