Muszę okresowo czyścić folder. Dostaję listę plików, która zawiera tekst, które pliki są dozwolone. Teraz muszę usunąć wszystkie pliki, których nie ma w tym pliku.
Przykład:
dont-delete.txt
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
Mój folder do czyszczenia zawiera to jako przykład:
ls /home/me/myfolder2tocleanup/
:
dontdeletethisfile.txt
reallyimportantfile.txt
neverdeletethis.txt
important.txt
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Więc te pliki powinny zostać usunięte:
this-can-be-deleted.txt
also-waste.txt
never-used-it.txt
Przeszukuję coś, aby utworzyć polecenie usuwania z opcją wykluczenia niektórych plików zawartych w pliku.
command-line
bash
scripts
rm
stefan83
źródło
źródło
Odpowiedzi:
rm
Komenda jest wypowiedziało się tak, że można sprawdzić i upewnić się, że wszystko działa jak potrzeba. Następnie po prostu cofnij komentarz do tej linii.check directory
Sekcja zapewni przypadkowo nie uruchomić skrypt z niewłaściwego katalogu i sprać niewłaściwych plików.Możesz usunąć
echo deleting
linię, aby uruchomić cicho.źródło
ls
i bezużytecznego przechwytywania danych wyjściowych,grep
jeśli wszystko, co chcesz wiedzieć, to czy było dopasowanie, czy nie. Użyłem również stałych wzorców, aby uniknąć problemów związanych z ucieczką.while
pętli nafor
pętlę nieumyślnie zmieniłeś opcjęiteration key
zi
naf
. w deklaracji, która złamała kod. Naprawiłem to.f
. ;-P (… i +1 za twoją odpowiedź, o której wcześniej zapomniałem.)Ten skrypt Pythona może to zrobić:
Ważną częścią jest odkomentowanie
os.unlink()
funkcji.UWAGA : dodaj ten skrypt i
dont-delete.txt
swójdont-delete.txt
, aby oba były na liście i trzymaj je w tym samym katalogu.źródło
set
w drugiej części zamiast listy O (1) zamiast wyszukiwania O (n) był używany .Oto jedna linijka:
ls
drukuje wszystkie pliki w bieżącym katalogu (w posortowanej kolejności)sort dont_delete
drukuje wszystkie pliki, których nie chcemy usuwać w posortowanej kolejności<()
operator włącza ciąg do obiektu plikopodobnycomm
polecenia porównuje dwa wstępnie posortowane pliki i wydruki na liniach, na których one się różnić-2 -3
flag powodujecomm
drukowanie tylko wierszy zawartych w pierwszym pliku, ale nie w drugim, co będzie listą plików, które można bezpiecznie usunąćtail +2
połączenie jest po prostu usunąć nagłówekcomm
wyjście, które zawiera nazwę pliku wejściowegoxargs
którego zamieni strumień wyjściowy w listę argumentówrm
. Te-p
siły opcjaxargs
prosić o potwierdzenie przed wykonaniem.źródło
FWIW wygląda na to, że możesz to zrobić natywnie
zsh
, używając(+cmd)
kwalifikatora glob.Aby to zilustrować, zacznijmy od niektórych plików
i plik białej listy
Najpierw przeczytaj białą listę do tablicy:
a może lepiej
(odpowiednik basha
mapfile
wbudowanego - lub jego synonimreadarray
). Teraz możemy sprawdzić, czy w tablicy istnieje klucz (nazwa pliku),${keepfiles[(I)filename]}
który zwraca 0, jeśli nie znaleziono dopasowania:Możemy użyć tego do utworzenia funkcji, która zwraca
true
jeśli nie ma żadnych dopasowań dla$REPLY
tablicy:Na koniec używamy tej funkcji jako kwalifikatora w naszym poleceniu:
lub w twoim przypadku
(Prawdopodobnie będziesz chciał dodać nazwę samego pliku białej listy do białej listy).
źródło
Zakładając, że twoja powłoka bash ma
extglob
shopt
włączone, oto nieco bardziej konserwatywna alternatywa:(... towarzyszące doskonałej sugestii komunikacyjnej @ gardenhead!)
źródło
Chyba że wynik
ls /home/me/myfolder2tocleanup/
przekracza maksymalny limit argumentów powłoki,ARG_MAX
który wynosi około 2 MB dla Ubuntu , proponuję następujące.Implementacja polecenia w jednym wierszu, która wykona zadanie, wyglądałaby następująco:
dont-delete.txt
plik do katalogu zawierającego pliki do usunięcia w następujący sposób:cd
do katalogu zawierającego pliki do usunięcia w następujący sposób:źródło
Zdecydowanie sugeruję użycie
rsync
zamieszczonego tutaj rozwiązania ; w przeciwnym razie zastosuj poniższe rozwiązanie ze wspomnianym wyjątkowym warunkiem.Zakładając, że nie ma białych znaków (spacji / tabulatorów) w twoich plikach wymienionych w pliku o nazwie
excludelist
, wtedy zrobiłbyś:Wystarczy dodać
-delete
do powyższego polecenia, aby usunąć pliki, które nie istnieją w pliku listy wykluczeń . Jeśli tu nie ma-delete
opcji można korzystaćrm
z-exec
jak następuje:Lub korzystając
-exec
z+
terminatorem zamiast.echo
służy tylko do pracy na sucho.źródło
Moja sugestia to:
Aktualizacja 2018-08-07
Przykład:
Uwaga po wierszu 3 będziesz mieć
dont-delete.txt
plik z zawartością:(prowadzenie
./
jest bardzo ważne )Pliki
c
id
zostaną usunięte.źródło