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
-deleteoraz jakie pliki zostaną zapisane poprzez usunięcie -deletei \!.
findjest 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ą extglobopcję 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ć rmze echoaby 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, ba a bpierwszy program usunie - jeśli umieścisz ab do części grep: "^[ab]$" aa bjednak 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ż $HOMEnie 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 -deletejest jednym ze sposobów obejścia tego.
tmpjeśli nie będzie w nim plików X/ Y/ Z. Uwaga !jako standardowy odpowiednik GNU -not( -deletejest także rozszerzeniem GNU)