Tôi có rất nhiều tệp và thư mục trong một thư mục cụ thể và tôi muốn xóa tất cả chúng; tuy nhiên, tôi muốn giữ các tệp X, Y và Z.
Có cách nào tôi có thể làm một cái gì đó như: rm * | but NOT grep | X or Y or Z
Tôi có rất nhiều tệp và thư mục trong một thư mục cụ thể và tôi muốn xóa tất cả chúng; tuy nhiên, tôi muốn giữ các tệp X, Y và Z.
Có cách nào tôi có thể làm một cái gì đó như: rm * | but NOT grep | X or Y or Z
Câu trả lời:
Thay vì sử dụng rm, nó có thể dễ dàng hơn để sử dụng find . Một lệnh như thế này sẽ xóa mọi thứ trừ một tệp có tên chính xác là 'tệp'
find . \! -name 'file' -delete
Nhiều phiên bản nên có thể hỗ trợ kết hợp biểu thức và kết hợp biểu thức chính quy.
Bạn cũng có thể dẫn đầu ra của find đến rm là tốt
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
cũng như những tập tin nào sẽ được lưu bằng cách xóa -delete
và \!
.
find
là đệ quy! do đó, tất cả các thư mục con không khớp với ' mẫu ' cũng sẽ bị xóa
Các phiên bản bash sau này có extglob
tùy chọn shell cung cấp cho bạn cú pháp để thực hiện những gì bạn muốn (kiểm tra trang người dùng của bạn trong "Mở rộng tên đường dẫn" để xem phiên bản đã cài đặt của bạn có chưa):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Để kiểm tra, tôi đề nghị đầu tiên bạn thay thế rm
với echo
để xem danh sách các file bị xóa là những gì bạn mong đợi.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Chú ý: Chạy lệnh và nếu các tệp cần xóa là đúng, hãy chạy lại và xóa ký tự băm "#".
Nếu tên tệp phức tạp hơn thì hãy làm
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Một lần nữa, đầu tiên nhìn vào kết quả sau đó loại bỏ dấu băm.
Phiên bản này - như được đề xuất trong các bình luận - lưu một số ký tự và trông rõ ràng hơn một chút.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
và a b
các chương trình đầu tiên sẽ xóa - nếu bạn đặt ab vào phần grep: "^[ab]$"
a
và b
nhưng không a b
, chỉ cần trái ngược với ý định của bạn. Lệnh thứ hai sẽ làm tương tự. Và thứ ba cũng vậy. Bạn không nên sử dụng 'ls' trong các tập lệnh, với các ngoại lệ rất, rất hiếm. Đừng làm điều đó.
Di chuyển các tập tin bạn muốn tránh xa. Đi lên một cấp, xóa thư mục. Tạo lại thư mục và di chuyển các tập tin đó trở lại.
/
, heh? Không thực tế lắm. c) Cố gắng xóa tất cả các tệp trong của bạn $HOME
cũng không thực tế.
Đây là những gì tôi thiết lập dưới dạng tập lệnh .sh cho hook logout OSX / MacOS, hoạt động đủ tốt.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
Với GNU-find, bạn có thể sử dụng khóa -delete, loại bỏ các thư mục, nếu trống, quá:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
là một cách để làm việc này.
tmp
nếu không có X
/ Y
/ Z
tập tin trong đó. Lưu ý !
là tương đương tiêu chuẩn của GNU -not
( -delete
cũng là phần mở rộng GNU)