Cách sao chép tập tin và thư mục trong Linux [14 ví dụ lệnh cp]

Tóm tắt: Trong hướng dẫn này, chúng ta sẽ thảo luận về một số ví dụ cụ thể về lệnh cp. Sau khi làm theo hướng dẫn này, người dùng sẽ có thể sao chép tệp và thư mục dễ dàng trên Linux bằng cách sử dụng giao diện dòng lệnh.

Là người dùng Linux, chúng ta giao tiếp với các tệp và thư mục từ thời gian này sang thời gian khác. Một trong những hoạt động thông thường mà người dùng thực hiện là sao chép các tệp và thư mục. Tất nhiên, chúng ta có thể sử dụng trình quản lý tệp đồ họa để thực hiện hoạt động sao chép. Tuy nhiên, phần lớn người dùng Linux thích sử dụng lệnh cp vì tính đơn giản và tính năng phong phú của nó.

Trong hướng dẫn dành cho người mới bắt đầu này, chúng ta sẽ tìm hiểu về lệnh cp. Như tên gọi, lệnh cp được sử dụng để sao chép tệp và thư mục tại một đường dẫn đã cho.

Trong suốt hướng dẫn này, chúng ta sẽ hiểu cách sử dụng lệnh cp bằng các ví dụ thực tế có thể sử dụng hàng ngày.

Cú pháp lệnh cp

Cú pháp của lệnh cp giống như các lệnh Linux khác. Ở mức cao, nó được chia thành hai phần – tùy chọn và đối số:

$ cp [OPTIONS]  
$ cp [OPTIONS]   ... 

Trong cú pháp trên, dấu ngoặc vuông ([]) biểu thị các đối số tùy chọn trong khi dấu ngoặc nhọn () biểu thị các đối số bắt buộc.

14 ví dụ lệnh cp

1. Cách sao chép tệp trong Linux

Một trong những cách sử dụng cơ bản của lệnh cp là sao chép một tệp vào thư mục hiện tại. Hầu hết thời gian, người dùng thực hiện hoạt động này để sao lưu các cấu hình quan trọng.

Ví dụ, chúng ta thường tạo bản sao dự phòng của tệp /etc/ssh/sshd_config trước khi cập nhật cấu hình SSH.

Để hiểu cách sử dụng, hãy tạo một tệp đơn giản:

$ touch file-1.txt

Tiếp theo, tạo bản sao của tệp bằng lệnh sau:

$ cp file-1.txt file-2.txt
Copy File in Linux
Sao chép tệp trên Linux

2. Hiển thị tiến trình lệnh sao chép

Trong ví dụ trước đó, chúng ta đã sử dụng lệnh ls để xác nhận liệu hoạt động sao chép tệp đã thành công hay không. Tuy nhiên, không có ý nghĩa nào sử dụng thêm một lệnh nữa chỉ để xác nhận kết quả của các lệnh trước đó.

Trong các trường hợp như vậy, chúng ta có thể kích hoạt chế độ chi tiết bằng cách sử dụng tùy chọn -v, cung cấp thông tin chẩn đoán cho mọi tệp được xử lý.

Hãy sao chép tệp file-1.txt bằng lệnh sau:

$ cp -v file-1.txt file-3.txt
Show Copy Output
Hiển thị đầu ra sao chép

3. Cách sao chép nhiều file vào thư mục

Cho đến nay, chúng tôi đã làm việc với một tệp duy nhất và chỉ mục làm việc hiện tại. Tuy nhiên, trong môi trường sản xuất thực tế, chúng ta phải làm việc với một số lượng lớn các tệp. Một trong những trường hợp sử dụng thông thường trong các môi trường như vậy là sao chép nhiều tệp vào một thư mục duy nhất.

Rõ ràng, chúng ta có thể thực hiện lệnh cp nhiều lần để đạt được điều đó, nhưng đó sẽ không phải là cách hiệu quả nhất. Để thực hiện hoạt động như vậy một cách hiệu quả, chúng ta có thể sử dụng cú pháp thay thế của lệnh cp.

Vì vậy, đầu tiên, hãy tạo một thư mục mới có tên dir-1:

$ mkdir dir-1

Bây giờ, hãy sao chép tất cả ba tệp vào thư mục dir-1 bằng cách sử dụng một lệnh duy nhất sau đây:

$ cp -v file-1.txt file-2.txt file-3.txt dir-1
Copy Multiple Files in Linux
Sao chép nhiều tệp trên Linux

Đầu ra trên cho thấy rằng tất cả các tệp đã được sao chép vào thư mục dir-1. Ngoài ra, điều quan trọng cần lưu ý là để sử dụng cú pháp thay thế này, thư mục phải tồn tại trước và phải là đối số cuối cùng của lệnh.

4. Cách tránh ghi đè tệp

Mặc định, lệnh cp sẽ thay thế tệp đích, có nghĩa là nó sẽ ghi đè lên tệp nếu cùng tên tại đích. Tuy nhiên, chúng ta có thể tắt hành vi mặc định này bằng tùy chọn -n.

Để hiểu điều này, hãy thử ghi đè lên tệp hiện có:

$ cp -n -v file-1.txt file-2.txt

Trong ví dụ này, chúng ta đã sử dụng tùy chọn -v để cho thấy rằng tệp file-2.txt chưa bị ghi đè.

5. Cách ghi đè tệp bằng xác nhận

Trong ví dụ trước đó, chúng ta đã thấy làm thế nào để tránh việc ghi đè tệp đích. Tuy nhiên, đôi khi chúng tôi muốn ghi đè lên tệp đích một cách an toàn.

Trong những trường hợp như vậy, chúng ta có thể sử dụng tùy chọn -i của lệnh để thực hiện sao chép tương tác. Tùy chọn này hiển thị thông báo cảnh báo và chờ sự xác nhận của người dùng trước khi ghi đè tệp.

Để minh họa điều này, hãy cố gắng ghi đè lên tệp hiện có:

$ cp -i file-1.txt file-2.txt

cp: overwrite 'file-2.txt'?

Như chúng ta có thể thấy, lệnh đang chờ xác nhận. Giống như các lệnh Linux khác, chúng ta có thể sử dụng 'y' để tiếp tục hoặc 'n' để hủy bỏ hoạt động.

Hành vi không tương tác mặc định của lệnh cp này không an toàn. Có khả năng người dùng có thể ghi đè lên cấu hình quan trọng một cách vô tình. Vì vậy, một số bản phân phối Linux yêu cầu hành vi tương tác mặc định bằng cách sử dụng lệnh alias:

$ alias cp='cp -i'

6. Chỉ ghi đè tệp nếu nguồn mới hơn

Trong ví dụ trước, chúng ta đã thấy làm thế nào để sử dụng chế độ tương tác. Tuy nhiên, đôi khi, người dùng có thể ghi đè lên tệp mới hơn một cách bất cẩn.

Để tránh các trường hợp dễ mắc lỗi như vậy, chúng ta có thể sử dụng tùy chọn -u, chỉ thực hiện hoạt động sao chép nếu nguồn mới hơn đích hoặc nếu tệp không tồn tại tại đích.

Trước hết, cập nhật timestamp của tệp nguồn:

$ touch -t 10101010 file-1.txt
$ ls -l file-1.txt

Trong ví dụ trên, chúng ta đã sử dụng tùy chọn -t của lệnh touch để đặt timestamp của tệp thành 10-Oct-2010.

Tiếp theo, hãy cập nhật timestamp của tệp đích thành thời gian hiện tại:

$ touch file-2.txt

Bây giờ, hãy thử thực hiện hoạt động sao chép bằng cách sử dụng tùy chọn -u:

$ cp -u -v file-1.txt file-2.txt

Ở đây, chúng ta có thể thấy rằng hoạt động sao chép không được thực hiện vì tệp đích mới hơn nguồn.

Cuối cùng, hãy đổi chỗ đối số nguồn và đích và thực hiện hoạt động sao chép:

$ cp -u -v file-2.txt file-1.txt

Trong đầu ra trên, chúng ta có thể quan sát rằng hoạt động sao chép thành công vì tệp nguồn mới hơn đích.

Overwrite File Only if the Source Is Newer
Ghi đè lên tệp chỉ nếu nguồn mới hơn

7. Cách sao lưu file trước khi ghi đè

Chúng ta có thể chỉ thị cho lệnh cp thực hiện sao lưu tệp đích trước khi ghi đè lên nó. Để đạt được điều này, chúng ta có thể sử dụng tùy chọn --backup, thực hiện sao chép sao lưu tự động.

$ cp --backup=numbered -v file-1.txt file-2.txt

Trong ví dụ này, chúng ta đã sử dụng chính sách sao lưu được đánh số. Chính sách này sử dụng số tăng tiến trong tên tệp sao lưu.

Để hiểu điều này, hãy thực hiện cùng một lệnh một số lần và quan sát kết quả:

$ cp --backup=numbered -v file-1.txt file-2.txt
$ cp --backup=numbered -v file-1.txt file-2.txt
$ cp --backup=numbered -v file-1.txt file-2.txt
Copy File Before Overwriting
Sao chép tệp trước khi ghi đè lên

8. Cách buộc sao chép để ghi đè tệp

Trong những ví dụ trước đó, chúng ta đã thấy làm thế nào để ghi đè lên tệp một cách an toàn. Tuy nhiên, trong một số trường hợp hiếm, yêu cầu là ghi đè lên tệp. Tuy nhiên, không có đảm bảo rằng hoạt động sẽ thành công mọi lần.

Ví dụ, hoạt động sao chép sẽ thất bại nếu tệp đích không có quyền ghi. Hãy minh họa điều này bằng một ví dụ.

Trước tiên, thay đổi quyền truy cập của tệp đích:

$ chmod 444 file-2.txt
$ ls -l file-2.txt

Bây giờ, hãy thử ghi đè lên tệp file-2.txt:

$ cp file-1.txt file-2.txt

Trong đầu ra trên, chúng ta có thể thấy rằng lệnh đã không thành công với lỗi permission denied.

Để khắc phục hạn chế này, chúng ta có thể sử dụng tùy chọn -f, xóa tệp đích và thực hiện hoạt động sao chép nếu không thể mở tệp đích.

Bây giờ, hãy sử dụng tùy chọn -f để ghi đè lên tệp một cách mạnh mẽ:

$ cp -f -v file-1.txt file-2.txt
Force Copy to Overwrite File
Đè lên tệp một cách mạnh mẽ

9. Cách xóa tệp đích trước khi sao chép

Trong ví dụ trước đó, chúng tôi đã thấy làm thế nào để xóa tệp đích nếu có lỗi khi hoạt động. Tuy nhiên, đôi khi yêu cầu là xóa tệp đích trước, sau đó thực hiện hoạt động sao chép.

Để đáp ứng yêu cầu như vậy, chúng ta có thể sử dụng tùy chọn --remove-destination.

$ cp --remove-destination -v file-1.txt file-2.txt
Remove Destination File Before Copying
Xóa tệp đích trước khi sao chép

Trong đầu ra trên, chúng ta có thể thấy rằng lệnh cp đã xóa tệp đích trước, sau đó thực hiện hoạt động sao chép.

10. Cách tạo tệp liên kết cứng thay vì sao chép

Chúng ta có thể tạo một liên kết cứng thay vì tạo một bản sao mới của tệp nguồn. Tùy chọn này đóng một vai trò quan trọng khi không đủ dung lượng đĩa.

Vậy hãy sử dụng tùy chọn -l để tạo một liên kết cứng:

$ cp -l -v file-1.txt file-4.txt

Bây giờ, hãy kiểm tra số hiệu inodes của cả hai tệp để xác minh các liên kết cứng:

$ ls -i1 file-1.txt file-4.txt
Create Hard Link File Instead of Copying
Tạo liên kết cứng thay vì sao chép

Trong đầu ra trên, các số trong cột đầu tiên biểu thị số hiệu inodes.

11. Cách tạo tệp liên kết mềm thay vì sao chép

Theo cùng một cách, chúng ta có thể tạo một liên kết mềm thay vì tạo một bản sao mới bằng cách sử dụng tùy chọn -s như dưới đây:

$ cp -s -v file-1.txt file-5.txt

Bây giờ, hãy xác minh rằng liên kết tượng trưng đã được tạo thành công:

$ ls -l file-5.txt
Create Soft Link Instead of Copying
Tạo liên kết mềm thay vì sao chép

Trong đầu ra trên, cột cuối cùng biểu thị mối quan hệ liên kết tượng trưng.

12. Cách bảo toàn thuộc tính tệp trong khi sao chép

Có các thuộc tính khác nhau được liên kết với tệp, chẳng hạn như thời gian truy cập, thời gian chỉnh sửa, quyền truy cập, v.v. Mặc định, các thuộc tính này không được bảo tồn trong quá trình sao chép. Để ghi đè lên hành vi mặc định này, chúng ta có thể sử dụng tùy chọn -p.

Để hiểu điều này, trước tiên hãy cập nhật timestamp của file-1.txt:

$ touch -t 10101010 file-1.txt

Bây giờ, hãy tạo bản sao của tệp này bằng cách bảo tồn tất cả các thuộc tính:

$ cp -p -v file-1.txt file-6.txt

Cuối cùng, hãy xác minh timestamp của tệp file-6.txt:

$ ls -l file-6.txt
Preserve the File Attributes While Copying
Bảo tồn thuộc tính tệp trong quá trình sao chép

13. Cách thực hiện thao tác sao chép đệ quy

Cho đến nay, chúng ta đã thấy làm thế nào để sao chép một tệp duy nhất. Tuy nhiên, đôi khi chúng ta phải sao chép tất cả các tệp và thư mục con của thư mục cụ thể.

Trong những trường hợp như vậy, chúng ta có thể sử dụng chế độ đệ quy bằng cách sử dụng tùy chọn -r hoặc -R.

Vậy hãy tạo một thư mục và thêm một số tệp và thư mục con vào nó:

$ mkdir -p dir-1/dir-2
$ touch dir-1/file-1.txt dir-1/dir-2/file-2.txt

Tiếp theo, hãy xác minh rằng cấu trúc thư mục đã được tạo thành công:

$ tree dir-1

Bây giờ, hãy sao chép thư mục dir-1 đệ quy bằng cách sử dụng lệnh sau:

$ cp -r -v dir-1 dir-3

Cuối cùng, hãy xác minh rằng tất cả các tệp và thư mục đã được sao chép thành công:

$ tree dir-3
Recursively Copy Files
Đệ quy sao chép các tệp

14. Cách sao chép nhiều thư mục

Tương tự như các tệp, chúng ta có thể sao chép nhiều thư mục đệ quy bằng một lệnh duy nhất. Tuy nhiên, để đạt được điều này, thư mục đích phải tồn tại trước và nó phải là đối số cuối cùng trong lệnh. Hãy hiểu điều này với một ví dụ.

Trước tiên, tạo một thư mục mới:

$ mkdir dir-4

Bây giờ, hãy sao chép các thư mục dir-1 và dir-3 vào thư mục dir-4 bằng lệnh sau:

$ cp -r -v dir-1 dir-3 dir-4

Một cách tương tự, chúng ta có thể sử dụng tùy chọn -t của lệnh để đạt được cùng kết quả. Tùy chọn này cho phép chúng ta chỉ định thư mục đích. Vì vậy, chúng ta cũng có thể sử dụng nó làm đối số đầu tiên:

$ cp -t dir-4 -r -v dir-1 dir-3
Copy Multiple Directories
Sao chép nhiều thư mục

Trong bài viết này, chúng ta đã thảo luận về cách sao chép tệp và thư mục bằng 14 ví dụ lệnh cp. Người mới bắt đầu có thể tham khảo những ví dụ này trong cuộc sống hàng ngày khi làm việc với các hệ thống Linux.