Xóa các Thư mục chứa tệp được chỉ định trong Mac OS X


0

Làm cách nào để xóa thư mục chứa tệp hoặc thư mục có tên cụ thể?

Ví dụ: tôi muốn xóa tất cả các thư mục chứa tệp "Things.txt":

/dirA/
/dirB/things.txt
/dirC/
/dirD/things.txt
/dirE/things.txt
/dirF/

Sau đó nó sẽ xóa dirB, dirD và dirE - không chỉ các tệp bên trong.

Cảm ơn!

Câu trả lời:


1

Một giải pháp mà không đường ống ở một nơi khác sẽ được vượt qua tên thư mục đến một subshell trong find's execchức năng.

Điều này sẽ không hiệu quả và tất nhiên nó sẽ cố gắng xóa các thư mục không tồn tại nếu chúng đã bị xóa.

find . -depth -type f -name 'things.txt' -exec sh -c 'rm -rf "$(dirname $0)"' {} \;

Nếu bạn muốn sử dụng xargs, bạn có thể làm điều đó rất đơn giản như vậy. Lưu ý rằng dirnamechỉ mất một đối số, vì vậy bạn phải xác định -n 1xargschỉ vượt qua một:

find . -depth -type f -name 'things.txt' | xargs -n 1 dirname | uniq | xargs rm -rf

Điều này sẽ không an toàn nếu tên thư mục của bạn chứa một dòng mới, vì vậy hãy lưu ý điều đó.


Cảm ơn vì những điều này! Một vấn đề: Khi tôi kiểm tra cái thứ hai, xargs -n 1chia tách tên thư mục với khoảng trắng trong đó, làm cho nó không thể sử dụng được. Có cách nào để khắc phục điều đó?
MynockSpit

Điều này đã làm việc với một vài thay đổi nhỏ! Thêm -print0vào tìm và -0xargs đã khắc phục vấn đề khoảng trắng, và vì tôi quyết định tôi muốn chuyển mọi thứ vào thùng rác và không xóa nó ngay lập tức, cuối cùng tôi đã thay đổi xargs thành xargs -0 -n 1 -I {} sh -c 'filename=$(dirname "{}"); mv "$filename" "./Trash";' Thanks a!
MynockSpit

0

Điều này đã được thử nghiệm trên Linux vì các lệnh dưới đây cũng có thể được thực thi trên hệ thống Unix.

find -type f -name 'things.txt' | xargs dirname | xargs rm -r

Giải trình:

find -type f -name 'things.txt' -> tìm kiếm tệp có tên 'Things.txt' (chỉ tệp chứ không phải thư mục)

| -> dẫn kết quả đến lệnh tiếp theo

xargs dirname| -> lấy tên thư mục tập tin được đặt trong đó dẫn kết quả sang lệnh tiếp theo

xargs rm -r -> tiến hành xóa tất cả các thư mục có tệp theo tên của 'Things.txt'

Voila!


Khi bạn đường ống từ findđến xargs, xin vui lòng sử dụng find ... -print0xargs -0.
slhck

Nó đã có kết quả như thế này : rm: cannont remove './DirD\n./DirB\n./DirE\n': No such file or directory. với -0, nó đang ngăn bash lặp tất cả các tập tin với các bộ chức năng kết hợp?
Faron

Trên thực tế, bạn đã kiểm tra lệnh của bạn? Nó sẽ trả về lỗi dirname: extra operand ... Things.txt'`.
slhck

Sau đó, nó phải là do phiên bản khác nhau của bash im sử dụng. Cảm ơn bạn đã chỉ ra rằng.
Faron

Bạn cần nói xargschỉ truyền một đối số cho dirname(xem câu trả lời của tôi). Có thể có hành vi mặc định khác nhau tùy thuộc vào các phiên bản tiện ích của bạn. OS X khác một chút so với Linux về vấn đề này.
slhck
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.