2013-01-12 15 views
7

Tôi muốn làm điều này trong OS X:OS X: danh sách và loại bỏ các tập tin với không gian

ls -rt | xargs rm -i 

Tuy nhiên, rm đang làm tắc nghẽn trên thực tế là một số trong những file có khoảng trắng.

Tôi đề cập đến OS X vì phiên bản ls của BSD không có cờ -Q.

Có cách nào để thực hiện việc này mà không phải sử dụng find -print0 không?

Trả lời

0

Hãy thử điều này

while read -u 3 
do 
    rm -i "$REPLY" 
done 3< <(ls -rt) 
+0

Giả sử phân tích cú pháp đầu ra 'ls' có thể chấp nhận được và số lượng tệp nhỏ, điều này hoạt động tốt, ngoại trừ việc không cần bộ mô tả tệp tùy chỉnh' 3'; chỉ '<<(ls -rt)' và 'đọc' mà không có' -u 3' sẽ làm. Ngoài ra, để được hoàn toàn mạnh mẽ, 'đọc-r', nên được sử dụng để tránh giải thích các phản ứng dữ dội. – mklement0

0

Chỉ cần tìm xóa nó cho bạn.

find . -print -depth 1 -exec rm -i {} \; 

Sẽ linh hoạt hơn, nếu không có chỗ trống.

2
[[email protected] staCK]$ touch "file name"{1..5}.txt 
[[email protected] staCK]$ ls -1 
file name1.txt 
file name2.txt 
file name3.txt 
file name4.txt 
file name5.txt 
[[email protected] staCK]$ ls -rt | xargs -I{} rm -v {} 
removed `file name5.txt' 
removed `file name4.txt' 
removed `file name3.txt' 
removed `file name2.txt' 
removed `file name1.txt' 

HOẶC

[[email protected] staCK]$ ls -1 
file a 
file b 
file c 
file d 

[[email protected] staCK]$ OLDIFS=$IFS; IFS=$'\n'; for i in `ls -1` ; do rm -i $i ; done ; IFS=$OLDIFS 
rm: remove regular empty file `file a'? y 
rm: remove regular empty file `file b'? y 
rm: remove regular empty file `file c'? y 
rm: remove regular empty file `file d'? y 
+0

++ cho phương pháp 'xargs -I {}'; Cách tiếp cận thứ 2 làm cho tên tệp theo nghĩa đen (globless globbing), trừ khi bạn cũng tắt globing với 'set -f' (và khôi phục lại sau). – mklement0

1

Nếu bạn muốn xóa tất cả các file, có chuyện gì với rm -i *?

Don't parse ls

0

Bạn có hai tùy chọn. Bạn có thể gọi xargs -0 với tùy chọn, trong đó tách đầu vào đối số sử dụng ký tự NUL (\0) như delimiters:

ls -rt | tr '\n' '\0' | xargs -0 rm -i 

hoặc bạn có thể sử dụng tùy chọn -I để phân chia các đầu vào chỉ dòng mới (\n) và gọi lệnh mong muốn một lần cho mỗi dòng đầu vào:

ls -rt | xargs -I_ rm -i _ 

sự khác biệt là phiên bản đầu tiên chỉ gọi rm một lần, với tất cả các đối số cung cấp như một danh sách duy nhất, trong khi cái thứ hai gọi rm riêng cho mỗi dòng trong đầu vào.

Các vấn đề liên quan