2013-05-27 43 views
9

Tôi muốn xóa tất cả các tệp tồn tại trong thư mục new-files từ một thư mục khác trong linux bằng lệnh bash.linux bash - xóa tất cả các tệp nằm trong một thư mục từ một thư mục khác

tôi cần điều này vì hai điều:

  • Tôi có một số kịch bản cài đặt mà sao chép một số tập tin cấu hình được cấu hình sẵn qua. Tôi muốn có tùy chọn để loại bỏ các tập tin một lần nữa
  • Đôi khi nó xảy ra rằng tài liệu lưu trữ được giải nén vào thư mục gốc của thư mục tải về của bạn và không phải vào một subdir vì người đóng gói file đặt mọi thứ vào tài liệu lưu trữ gốc

Cách tốt nhất để làm điều đó là gì?

Chỉnh sửa, để làm rõ:

  1. tôi nhận được một thư mục với các tập tin gọi là new-files.
  2. Bây giờ tôi thực hiện cp -r new-files/* other-directory/.
  3. Cho phép nói thư mục khác không phải là thư mục tôi muốn sao chép chúng nhưng nó đã chứa các tệp khác nên tôi không thể chỉ làm rm thư mục khác/*.
  4. Tôi cần xóa tất cả các thư mục mà tôi đã vô tình sao chép. Làm thế nào để làm điều đó?

Trả lời

13

Bạn có thể sử dụng lệnh sau:

cd new-files ; find . -exec rm -rf path/to/other-directory/{} \; 

Nó sẽ liệt kê tất cả các tập tin mà nơi sao chép từ thư mục new-files (new-files thư mục sẽ không được xem xét). Đối với mỗi tệp, nó sẽ xóa phiên bản đã sao chép trong other-directory.

Nhưng bạn phải cẩn thận, nếu một tệp trong new-files xóa tệp trong other-directory, bạn sẽ không thể khôi phục tệp cũ bằng phương pháp này. Bạn nên cân nhắc sử dụng hệ thống phiên bản (ví dụ như Git).

+2

Đẹp nhất! Tôi khuyên bạn nên sử dụng '-exec' với dấu '+' không ';'. Điều này hiệu quả hơn khi 'rm' được gọi là ít hơn nhiều lần (tương tự như' xargs'). – TrueY

+0

@TrueY Bạn không thể làm điều đó. 'find' đưa ra một lỗi nếu bạn sử dụng' + 'trong khi' {} 'được bắt đầu bởi một ký tự không dấu cách. – aymericbeaumet

+0

Bạn muốn đạt được điều gì với regex đó? Nó có vẻ như tiêu diệt lệnh của tôi khi nó lọc ra 'conf.d' directorys và như vậy? – Zulakis

2

kịch bản wee để làm những gì bạn muốn:

pushd `pwd` 
cd /path/to/new-files 
x=`find . -type f` 
popd 

echo $x | xargs rm 
+0

Tôi có nghĩa là nó như thế này: kiểm tra các tập tin được chứa trong 'mới files' và xóa chúng (nếu chúng tồn tại) từ một thư mục khác – Zulakis

+0

Xin lỗi nếu nó không rõ ràng, tiếng Anh không phải là ngôn ngữ mẹ đẻ của tôi – Zulakis

+0

Tôi đã thêm một ví dụ khác vào bài đăng đầu tiên của tôi, có thể điều này giúp – Zulakis

4

Từ bạn:

Chỉnh sửa, để làm rõ:

  1. tôi nhận được một thư mục với các tập tin gọi là new-files.
  2. Bây giờ tôi thực hiện cp -r new-files/* other-directory/.
  3. Cho phép nói thư mục khác không phải là thư mục tôi muốn sao chép chúng nhưng nó đã chứa các tệp khác nên tôi không thể chỉ làm rm thư mục khác/*.
  4. Tôi cần xóa tất cả các thư mục mà tôi đã vô tình sao chép. Làm thế nào để làm điều đó?

Bạn lặp qua các dir gốc new-files/ và có thể xóa các tập tin cùng tên trong other-directory/:

for file in /new-files/* 
do 
    rm /other-directory/"$file" 
done 
Các vấn đề liên quan