Mam wiele plików i folderów w określonym folderze i chcę je wszystkie usunąć; chciałem jednak zachować pliki X, Y i Z.
Czy mogę zrobić coś takiego: rm * | but NOT grep | X or Y or Z
command-line
rm
Amit
źródło
źródło
Odpowiedzi:
Zamiast używać rm, może być łatwiej użyć find . Takie polecenie usunie wszystko oprócz pliku o nazwie dokładnie „plik”
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
źródło
-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ęteUżywanie zsh, z
setopt EXTENDED_GLOB
, używanie~
operatora ( oprócz )lub
^
operator (negacja):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.
źródło
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):Aby przetestować, proponuję najpierw wymienić
rm
zeecho
aby sprawdzić, czy lista plików, które mają zostać usunięte, co można się spodziewać.źródło
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
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.
źródło
egrep
argumentu na"^(file1|filename2|f1le)$"
a
,b
aa b
pierwszy program usunie - jeśli umieścisz ab do części grep:"^[ab]$"
a
ab
jednak niea 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.
źródło
/
, 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.
źródło
Za pomocą GNU-find możesz użyć przełącznika -delete, który usuwa również katalogi, jeśli są również puste:
źródło
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ówX
/Y
/Z
. Uwaga!
jako standardowy odpowiednik GNU-not
(-delete
jest także rozszerzeniem GNU)