Các tập tin 'rm *' có xóa tất cả các kết quả khớp khỏi tất cả các thư mục con không?


13

Tôi muốn xóa bất kỳ tập tin nào trông giống như wordpress-891.sqltừ thư mục hiện tại (không phải trong thư mục con).

Sẽ rm wordpress-*.sqlthực hiện các mẹo hay nó cũng sẽ loại bỏ các kết quả trùng khớp khỏi các thư mục con?


1
Như một bên, trong khi tất cả các câu trả lời khác kết thúc chính xác, có một nút thắt nữa: đó thực sự là bash, không phải lệnh rm, mở rộng ký tự đại diện. Nếu bạn có mười tệp phù hợp trong thư mục của mình, rm sẽ không thấy ký tự đại diện, mà là mười đối số riêng lẻ. Nếu bạn muốn rm thực hiện việc mở rộng, bạn phải đưa đối số của mình vào dấu ngoặc đơn. Đối với rm, nó không tạo ra sự khác biệt, nhưng trong một số bối cảnh khác, nó có thể. Thông thường, khi ký tự đại diện đề cập đến một cái gì đó ngoài các tệp, chẳng hạn như các gói apt-get.
Kevin Keane

3
@KevinKeane, rmkhông thực hiện mở rộng tên tệp ... rm "foo*"sẽ cố gắng xóa một tệp có dấu hoa thị theo nghĩa đen.
ilkkachu

Câu trả lời:


20

Số bình thường *không phải là đệ quy và cũng không rm.

Nếu tên thư mục trùng khớp, nó sẽ không bị xóa - bạn cần -rcờ để xóa một thư mục.

Vì vậy, thật an toàn khi làm điều đó nếu bạn chắc chắn muốn xóa các tệp đó.

Bạn cũng có thể rmtương tác

rm -i wordpress-*.sql

sau đó nó sẽ yêu cầu xác nhận trước khi xóa từng tập tin


14

Có, nó thực hiện thủ thuật cho bạn và xóa tất cả các tệp có lược đồ đó trong thư mục hiện tại. Và KHÔNG, nó không xóa các tập tin trong các thư mục con.

Khi nào bạn không chắc chắn điều gì sẽ xảy ra khi bạn chạy một lệnh như:

rm wordpress-*.sql

sau đó chỉ cần chạy nó bằng cách sử dụng ls:

ls wordpress-*.sql

các tập tin bạn nhìn thấy trong đầu ra là những tập tin sẽ bị xóa.

Khi bạn đang cố gắng để có được một danh sách như foo*:, tốt hơn là sử dụng -dchuyển đổi với lsđể ngăn chặn các tệp liệt kê với một thư mục có tên, foobar/v.v.

ls -d foo*

Thủ thuật này hoạt động cho các lệnh không được sử dụng để thực hiện công việc đệ quy.

Một điều khác bạn có thể làm là nhập dữ liệu đầu vào mong muốn của mình, ví dụ: wordpress-*sau đó nhấn Ctrl+ Alt+ *và bây giờ tất cả các kết quả khớp được gõ tự động trước lệnh của bạn.


4
Phương pháp yêu thích của tôi:printf "%s\n" wordpress-*.sql
wjandrea

1
Bạn cũng có thể giả vờ như Echo echo rm file*. Đặc biệt tìm kiếm các tên tệp thù địch như-rf
eckes

@eckes: Bạn có thể bao gồm những người an toàn hơn với một trong hai rm ./*hoặc rm -- *.
David Foerster

Có, hoặc sử dụng xargs -0@DavidFoerster
eckes

nếu bạn đi ls foo*và bạn có một thư mục được gọi foobar, bạn cũng sẽ nhận được một danh sách các nội dung của thư mục đó, vì vậy, lsthực sự không phải là cách tốt nhất cho những gì rmsẽ xảy ra
ilkkachu

12

Không, rmkhông tái diễn thông qua các thư mục con.

Xem Xóa tệp phù hợp trong tất cả các thư mục con - SuperUser để biết các phương pháp xóa tệp trong thư mục con.

Nếu bạn từng lo lắng về việc vô tình xóa một cái gì đó quan trọng, hãy sử dụng gvfs-trash(sẽ gửi tệp vào thùng rác) thay vì rm(xóa vĩnh viễn các tệp).


Cảm ơn bạn đã gvfs-trashđề cập đến một cái gì đó ngày hôm nay hầu như không sử dụng nó ...
George Udosen

-1

Nếu bạn muốn tìm và xóa tất cả các tệp phù hợp như wordpress-*.sql, bạn có thể sử dụng findlệnh. :)

Chẳng hạn, bạn muốn xóa tất cả các tệp phù hợp với wordpress-*.sqlbên dưới test_dir, làm như sau.

cd test_dir
find . -name "wordpress-*.sql" -exec rm -f {} \;

Bất cứ khi nào findchương trình thực sự tìm thấy một tập tin phù hợp, nó sẽ cố gắng thực hiện một lệnh theo sau -exectùy chọn. Trong trường hợp rm -f {}này sẽ được thực thi và {}sẽ được thay đổi thành tên tệp phù hợp. Ví dụ

rm -f wordpress-169.sql

Bạn cũng có thể đặt độ sâu của thư mục con với -maxdepthtùy chọn.

cd test_dir
find . -maxdepth 3 -name "wordpress-*.sql" -exec rm -f {} \;

Xin lưu ý rằng bạn phải chỉ định -maxdepthtùy chọn trước các tùy chọn khác. Nếu không, bạn có thể đáp ứng kết quả những gì bạn thực sự không muốn thấy.


1
OP muốn điều ngược lại: không tái phạm vào các thư mục con.
Melebius

2
GNU find: "các tùy chọn ảnh hưởng đến tất cả các thử nghiệm, bao gồm các thử nghiệm được chỉ định trước tùy chọn", danh sách các tùy chọn bên dưới bao gồm -maxdepth. Sử dụng -exec rm -f {} +thay vì -exec \;, hoặc tốt hơn nữa, chỉ-delete
ilkkachu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.