Odpowiedzi:
Zamiast używać rm, może być łatwiej użyć find . Takie polecenie usunie wszystko oprócz pliku o nazwie dokładnie „plik”
find . \! -name 'file' -delete
Wiele wersji powinno być w stanie obsługiwać globowanie i dopasowanie wyrażeń regularnych.
Możesz także przesłać dane wyjściowe find do rm
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
oraz jakie pliki zostaną zapisane poprzez usunięcie -delete
i \!
.
find
jest rekurencyjny! więc wszystkie podkatalogi plików, które nie pasują do „ wzorca ”, również zostaną usunięte
Używanie zsh, z setopt EXTENDED_GLOB
, używanie ~
operatora ( oprócz )
rm -- *~(x|y|z)
lub ^
operator (negacja):
rm -- ^(x|y|z)
Ale prawdopodobnie powinieneś zamiast tego przenieść pliki w inne miejsce, a następnie usunąć wszystko. Jest o wiele bezpieczniejszy pod względem poślizgnięć palców, takich jak zbyt wczesne trafienie.
Późniejsze wersje bash mają extglob
opcję powłoki, która daje ci składnię do robienia tego, co chcesz (sprawdź swoją stronę podręcznika w „Pathname Expansion”, aby zobaczyć, czy ma ją zainstalowana wersja):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Aby przetestować, proponuję najpierw wymienić rm
ze echo
aby sprawdzić, czy lista plików, które mają zostać usunięte, co można się spodziewać.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Uwaga: Uruchom polecenie i jeśli pliki do usunięcia są odpowiednie, uruchom je ponownie i usuń znak krzyżyka „#”.
Jeśli nazwy plików są bardziej skomplikowane, zrób to
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Ponownie, spójrz najpierw na wyniki, a następnie usuń znak skrótu.
Ta wersja - jak sugerowano w komentarzach - zapisuje niektóre postacie i wygląda nieco jaśniej.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
a a b
pierwszy program usunie - jeśli umieścisz ab do części grep: "^[ab]$"
a
a b
jednak nie a b
, po prostu w przeciwieństwie do swoich zamiarów. Drugie polecenie zrobi to samo. I trzeci też. Nie należy używać „ls” w skryptach, z bardzo, bardzo rzadkimi wyjątkami. Po prostu nie rób tego.
Przenieś pliki, które chcesz zachować. Przejdź o jeden poziom wyżej, usuń folder. Utwórz ponownie folder i przenieś te pliki z powrotem.
/
, heh? Niezbyt praktyczne. c) Próba usunięcia wszystkich plików z twojego pliku również $HOME
nie jest zbyt praktyczna.
To właśnie skonfigurowałem jako skrypt .sh dla haka do wylogowywania OSX / MacOS, działa wystarczająco dobrze.
#! /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
Za pomocą GNU-find możesz użyć przełącznika -delete, który usuwa również katalogi, jeśli są również puste:
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
jest jednym ze sposobów obejścia tego.
tmp
jeśli nie będzie w nim plików X
/ Y
/ Z
. Uwaga !
jako standardowy odpowiednik GNU -not
( -delete
jest także rozszerzeniem GNU)