Nếu bạn mới sử dụng Linux, bạn nên biết rằng dòng lệnh là một công cụ rất mạnh mẽ, có khả năng thực hiện hầu hết các tác vụ mà bạn có thể thực hiện thông qua giao diện đồ họa. Tuy nhiên, thường thì bạn sẽ thấy mình thực hiện các tác vụ đơn giản trên dòng lệnh. Một trong những tác vụ đơn giản đó là sao chép tệp/thư mục.
Lệnh cp của Linux cung cấp cho bạn khả năng sao chép tệp và thư mục thông qua dòng lệnh. Trong hướng dẫn này, chúng ta sẽ thảo luận về cách sử dụng cơ bản của công cụ này bằng các ví dụ dễ hiểu. Nhưng trước khi thực hiện, chúng ta cần chia sẻ rằng tất cả các ví dụ/hướng dẫn được đề cập trong bài viết này đều đã được thử nghiệm trên Ubuntu 16.04LTS.
Lệnh trên sao chép SOURCE sang DEST. Các ví dụ về loại Hỏi & Đáp sau đây sẽ giúp bạn hiểu rõ hơn về cách thức hoạt động của công cụ.
Ví dụ:
Như bạn có thể thấy trong ảnh chụp màn hình ở trên, tùy chọn -i khiến cp hỏi người dùng có ghi đè lên tệp hiện có cùng tên trong thư mục đích hay không.
Ví dụ:
Xin lưu ý rằng -n ghi đè tùy chọn -i, nghĩa là ngay cả khi bạn đã sử dụng -i với -n, lệnh sẽ không chạy ở chế độ tương tác.
Ví dụ:
Ví dụ:
Ví dụ, giả sử bạn muốn sao chép 'file1' nằm trong thư mục làm việc hiện tại vào thư mục Desktop, nhưng đích đã có một tệp có tên là 'file1'. Và bạn chỉ muốn sao chép nếu nguồn mới hơn đích. Điều này có thể được thực hiện bằng lệnh sau:
Tuy nhiên, nếu yêu cầu là sao chép chính liên kết tượng trưng, thì điều này có thể thực hiện được bằng cách sử dụng tùy chọn dòng lệnh -P, tùy chọn này yêu cầu cp không theo các liên kết tượng trưng trong source. Vì vậy, trong trường hợp của chúng ta, lệnh sẽ là:
Ví dụ, file1 có các thuộc tính sau:
Và file2 có các thuộc tính sau:
Lưu ý: Bạn có thể sử dụng lệnh ls để lấy các thuộc tính này cho một tệp. Để biết thêm thông tin về ls, hãy truy cập vào đây.
Yêu cầu là sao chép các thuộc tính của file2 và cũng có chúng cho file1, sau đây là cách thực hiện:
Đây là lệnh đã đề cập trong hành động:
Lệnh cp của Linux cung cấp cho bạn khả năng sao chép tệp và thư mục thông qua dòng lệnh. Trong hướng dẫn này, chúng ta sẽ thảo luận về cách sử dụng cơ bản của công cụ này bằng các ví dụ dễ hiểu. Nhưng trước khi thực hiện, chúng ta cần chia sẻ rằng tất cả các ví dụ/hướng dẫn được đề cập trong bài viết này đều đã được thử nghiệm trên Ubuntu 16.04LTS.
Lệnh cp của Linux
Cần thực hiện thao tác sao chép trên dòng lệnh, cp sẽ là lệnh bạn cần dùng. Theo trang hướng dẫn, công cụ này có thể được sử dụng để sao chép cả tệp và thư mục. Sau đây là cú pháp chung của lệnh:
Mã:
cp [OPTION]... SOURCE DEST
Câu hỏi 1. Làm thế nào để thực hiện thao tác sao chép cơ bản?
Cách sử dụng cơ bản của cp rất dễ - tất cả những gì bạn phải làm là chỉ định nguồn và đích. Ví dụ, lệnh sau sao chép 'file1' có trong thư mục làm việc hiện tại vào thư mục Desktop:
Mã:
cp file1 ~/Desktop
Câu hỏi 2. Làm thế nào để nhắc cp trước khi ghi đè?
Nếu đích mà bạn đang sao chép tệp đã chứa một tệp có cùng tên, thì lệnh cp sẽ ghi đè lên tệp hiện có một cách âm thầm. Tuy nhiên, nếu muốn, bạn có thể nhắc công cụ trước khi ghi đè xong. Bạn có thể thực hiện việc này bằng cách chạy cp ở chế độ tương tác, được bật bằng tùy chọn -i.Ví dụ:
Mã:
cp -i file1 ~/Desktop/
Như bạn có thể thấy trong ảnh chụp màn hình ở trên, tùy chọn -i khiến cp hỏi người dùng có ghi đè lên tệp hiện có cùng tên trong thư mục đích hay không.
Câu hỏi 3. Làm thế nào để buộc cp không ghi đè lên tệp hiện có?
Đôi khi, bạn có thể không muốn cp ghi đè lên tệp hiện có và bạn cũng không muốn bật tùy chọn tương tác mà chúng ta vừa thảo luận ở phần trước. Sau đó, đối với những tình huống như thế này, bạn có thể sử dụng tùy chọn dòng lệnh -n.Ví dụ:
Mã:
cp -n file1 ~/Desktop/
Câu hỏi 4. Làm thế nào để sao chép thư mục bằng cp?
Theo mặc định, lệnh cp chỉ hoạt động đối với các tệp. Nếu bạn thử sao chép một thư mục, bạn có thể sẽ gặp lỗi "cp: omitting directory". Vì vậy, bất cứ khi nào yêu cầu là sao chép một thư mục, hãy sử dụng tùy chọn dòng lệnh -r.Ví dụ:
Mã:
cp -r dir ~/Desktop
Câu hỏi 5. Làm thế nào để tạo liên kết tượng trưng bằng lệnh cp?
Nếu muốn, bạn cũng có thể yêu cầu cp tạo liên kết tượng trưng thay vì thực sự sao chép một tệp. Điều này có thể được thực hiện bằng tùy chọn dòng lệnh -s.Ví dụ:
Mã:
cp -s ~/htf-daily/file1 ~/Desktop/
Câu hỏi 6. Làm thế nào để cp ghi đè lên tệp đích chỉ khi tệp nguồn mới hơn?
Đôi khi, yêu cầu là ghi đè lên tệp hiện có chỉ khi tệp nguồn mới hơn - hãy nghĩ đến quá trình này như việc cập nhật tệp. Điều này có thể được thực hiện bằng tùy chọn dòng lệnh -u.Ví dụ, giả sử bạn muốn sao chép 'file1' nằm trong thư mục làm việc hiện tại vào thư mục Desktop, nhưng đích đã có một tệp có tên là 'file1'. Và bạn chỉ muốn sao chép nếu nguồn mới hơn đích. Điều này có thể được thực hiện bằng lệnh sau:
Mã:
cp -u file1 ~/Desktop
Câu hỏi 7. Làm thế nào để cp không theo các liên kết tượng trưng trong nguồn?
Theo mặc định, lệnh cp sẽ theo các liên kết tượng trưng trong source. Điều này có nghĩa là, ví dụ, nếu bạn đang cố sao chép một tệp là liên kết tượng trưng đến một tệp khác, thì theo mặc định, hành động sao chép sẽ được thực hiện trên tệp mà liên kết tượng trưng tham chiếu đến. Ý tôi là, nếu ~/Desktop/file1 là liên kết tượng trưng đến ~/htf-daily/file1 và bạn thử sao chép ~/Desktop/file1 đến ~/Downloads, thì ~/htf-daily/file1 sẽ được sao chép tại đó.Tuy nhiên, nếu yêu cầu là sao chép chính liên kết tượng trưng, thì điều này có thể thực hiện được bằng cách sử dụng tùy chọn dòng lệnh -P, tùy chọn này yêu cầu cp không theo các liên kết tượng trưng trong source. Vì vậy, trong trường hợp của chúng ta, lệnh sẽ là:
Mã:
cp -P ~/Desktop/file1 ~/Downloads/
Câu hỏi 8. Làm thế nào để chỉ sao chép các thuộc tính của tệp?
Đôi khi, yêu cầu chỉ có thể là sao chép các thuộc tính (như quyền sở hữu và dấu thời gian) chứ không phải nội dung của tệp. Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn dòng lệnh --attributes-only cùng với tùy chọn --preserve.Ví dụ, file1 có các thuộc tính sau:
Mã:
-rw-rw-r-- 1 root himanshu 97 Jun 14 17:18 file1
Mã:
-rw-rw-r-- 1 root himanshu 179 May 25 15:09 file2
Yêu cầu là sao chép các thuộc tính của file2 và cũng có chúng cho file1, sau đây là cách thực hiện:
Mã:
cp --attributes-only --preserve file2 file1