Tôi cần xóa tất cả các tập tin trong một thư mục, nhưng loại trừ một số trong số họ. Ví dụ, trong một thư mục chứa các tệp a b c ... z
, tôi cần xóa tất cả ngoại trừ u
và p
. Có cách nào làm dễ hơn không?
Tôi cần xóa tất cả các tập tin trong một thư mục, nhưng loại trừ một số trong số họ. Ví dụ, trong một thư mục chứa các tệp a b c ... z
, tôi cần xóa tất cả ngoại trừ u
và p
. Có cách nào làm dễ hơn không?
Câu trả lời:
Những gì tôi làm trong những trường hợp đó là gõ
rm *
Sau đó, tôi nhấn Ctrl+ X, *để mở rộng *
thành tất cả các tên tệp hiển thị.
Sau đó, tôi có thể loại bỏ hai tệp tôi muốn giữ khỏi danh sách và cuối cùng thực thi dòng lệnh.
*
mở rộng quá không quá dài. : -}
Ctrl
+ Shift
+ x
+*
Để rm
tất cả nhưng u,p
trong bash chỉ cần gõ:
rm !(u|p)
Điều này yêu cầu tùy chọn sau được đặt:
shopt -s extglob
Xem thêm: toàn cầu - Wiki của Greg
shopt -s extglob
, @Ashot. Ngoài ra, đó chỉ là các tệp, không phải thư mục, đó là lý do tại sao tôi đã xóa các -rf
tùy chọn trong lệnh của bạn.
rm !(index).html
. Thao tác này sẽ xóa tất cả các tệp kết thúc bằng ".html" ngoại trừ "index.html".
Bạn có thể dùng find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
phủ nhận biểu thức tiếp theo-name
chỉ định tên tệp-maxdepth 1
sẽ làm cho quá trình tìm chỉ thư mục được chỉ định ( find
theo thư mục đi qua mặc định)-type f
sẽ chỉ xử lý các tệp (và không phải thư mục ví dụ)-delete
sẽ xóa các tập tinSau đó, bạn có thể điều chỉnh các điều kiện nhìn vào trang tìm kiếm
Cập nhật
Kiểm tra lệnh của bạn trước bằng cách sử dụng -print
thay vì-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
ngay sau .
đó sẽ là thảm họa (sẽ xóa tất cả các tệp trong CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
là người bạn tốt nhất của tôi, đặc biệt là khi có quá nhiều tệp trên toàn cầu
Đơn giản:
mv
các tập tin bạn muốn trong một thư mục trên, rm
thư mục và sau đó mv
chúng trở lại.
rm
không -r
sẽ không loại bỏ các thư mục con.
Khá giống với câu trả lời này nhưng không có tùy chọn đặc biệt nào là cần thiết, theo như tôi biết sau đây là chức năng "cổ đại" được hỗ trợ bởi bất kỳ vỏ (mơ hồ) / bin / sh nào (ví dụ bash, zsh, ksh, v.v.)
rm [^up]
rm [^up]*
? Tôi làm những điều tương tự khá thường xuyên.
Làm điều đó mà không tìm thấy:
ls | grep -v '(u|p)' | xargs rm
(Chỉnh sửa: "u" và "v", như ở những nơi khác ở đây, đang được sử dụng làm phiên bản chung của toàn bộ các biểu thức. Rõ ràng bạn sẽ muốn cẩn thận neo các biểu thức của mình để tránh khớp quá nhiều thứ.)
Bạn chắc chắn sẽ muốn có một kịch bản nếu bạn sẽ thực hiện nhiều điều này, như những người khác đã đề xuất.
-E
hoặcegrep
u
hoặc mộtp
grep -L (u|p)' * | xargs rm
nơi -L
danh sách tên tệp không chứa một trận đấu.
u
hoặc p
, không phải bất kỳ tập tin nào chứa a u
hoặc a p
. Đúng rồi. Bạn có thể khắc phục bằng cách sử dụngegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
Quay trở lại thời kỳ mềm, tôi đã có một chương trình thực thi dos gọi là "Ngoại trừ" sẽ di chuyển mọi thứ ra khỏi thư mục hiện tại theo thời gian và thực thi một lệnh, vì vậy bạn có thể nói:
ngoại trừ * .txt del *. *
để xóa tất cả mọi thứ trừ các tập tin văn bản của bạn.
Đây sẽ là một điều khá nhỏ để thực hiện như một kịch bản shell và nếu đây là loại việc bạn có khả năng làm nhiều hơn hai lần thì có vẻ như đó sẽ là một ý tưởng tốt.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Điều này sẽ xóa tất cả các tệp ngoại trừ u và p trong unix
Đối với những người thích chỉ định các mẫu loại trừ phức tạp tùy ý (bao trùm tất cả các tên tệp bị ảnh hưởng) theo kiểu emacs regrec đầy đủ, kiểu posix-awk hoặc kiểu mở rộng posix (xem trang man) tôi sẽ đề xuất kiểu này. Nó loại trừ u
và p
trong thư mục hiện tại trong ví dụ này. Điều này có thể hữu ích cho các kịch bản.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
sẽ chỉ hoạt động trên các phiên bản GNU
find
là phần mở rộng của find
lệnh GNU . Áp dụng tương tự cho -regextype
tùy chọn. Ngoài ra, lệnh của bạn cũng sẽ xóa các tệp trong thư mục con, trong khi câu hỏi ban đầu hỏi rõ ràng về các tệp trong một thư mục.
Tôi luôn luôn sử dụng:
rm [a-o,q-t,v-z]*
Điều này sẽ cho phép bạn xác định mức độ chi tiết mà bạn muốn thực hiện. Vì vậy, nếu bạn muốn xóa các tập tin o và Z, bạn có thể sử dụng:
rm [a-o,z]*
Còn nữa:
for FILE in ./*; do if [[ $FILE != ./u* ]] || [[ $FILE != ./p* ]];then rm $FILE; fi; done;
Nó khá dài và tôi không biết liệu bạn có thể dễ dàng biến nó thành một hàm có thể dễ dàng chứa và số lượng đối số tùy ý hay không, nhưng nó hoạt động tốt.
Và đó là lòng tốt bash thuần túy.
Đây là một biến thể khác. Bạn có thể gõ:
rm -i *
hoặc là:
rm --interactive *
Vì vậy, rm
sẽ yêu cầu bạn xác nhận xóa từng tập tin.
Sử dụng:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
để xóa tất cả các tệp bao gồm các thư mục, ngoại trừ các tệp u, p và .ext.
Một cách đơn giản khó gây rối: giả sử bạn muốn xóa mọi thứ trừ * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp