Mam katalog zawierający dużą liczbę plików. Chcę usunąć wszystkie pliki oprócz pliku file.txt. Jak mam to zrobic?
Istnieje zbyt wiele plików, aby usunąć osobno niechciane pliki, a ich nazwy są zbyt różnorodne, aby używać *, aby usunąć je wszystkie oprócz tego jednego pliku.
Ktoś zasugerował użycie
rm !(file.txt)
Ale to nie działa. Zwraca:
Badly placed ()'s
Mój system operacyjny to Scientific Linux 6.
Jakieś pomysły?
file-management
Kantura
źródło
źródło
Odpowiedzi:
POSIXly:
usunie wszystkie zwykłe pliki (rekurencyjnie, w tym ukryte) oprócz
file.txt
. Aby usunąć katalogi, zmienić-type f
się-type d
i dodaj-r
opcjęrm
.W
bash
, aby użyćrm -- !(file.txt)
, musisz włączyć extglob :(lub dzwoniąc
bash -O extglob
)Zauważ, że
extglob
działa tylko wbash
rodzinie powłok Korna. A używanierm -- !(file.txt)
może powodowaćArgument list too long
błąd.W
zsh
można użyć^
do zanegowania wzorca przy włączonym rozszerzonymglobie :lub korzystając z tej samej składni
ksh
ibash
opcjeksh_glob
ino_bare_glob_qual
włączona.źródło
rm
as”echo rm
i proszę ludzi, aby wydobywali echo tylko wtedy, gdy są naprawdę pewni, że zrobi to, co chcą. Poza tym +1 za dokładną odpowiedź-delete
zamiast-exec
, krótszego i łatwiejszego do zapamiętania-delete
nie jest zdefiniowany przez POSIX.find
rozwiązaniem Gnouc, które możesz zrobić! \( -name one_file -o -name two_file \)
i tak dalej.Kolejne podejście w innym kierunku (iff nie ma spacji w nazwach plików)
lub (działa, nawet jeśli w nazwach plików są spacje)
z
man grep
:źródło
ls | grep -v "a file with spaces.bin" | xargs rm
. To jest normalnagrep
składnia.grep
alerm
.rm
otrzyma listę argumentów oddzielonych spacjami. Spróbujtouch 'a b'; touch 'c d'; ls | grep -v 'a b' | xargs rm
: dostanieszrm: c: No such file or directory
irm: d: No such file or directory
-print0
wfind
i-0
wxargs
. Oto obejście, ale jest nieco niewygodne.find . -maxdepth 1 -type f | grep -v 'a b' | tr '\n' '\0' | xargs -0 rm
. Nawiasem mówiąc, GNUparallel
dobrze sobie z tym radzi (prawie zawsze używam go jako zamiennika xargs:ls | grep -v 'a b' | parallel rm
-
.Zachowaj kopię, usuń wszystko, przywróć kopię:
W jednej linii:
Ale to wymaga powłoki, która obsługuje ciągi tutaj.
źródło
rm
atar -x
.rm
może zawieść tyle, ile chce.wszyscy nad tym zastanawiacie się.
Gotowy.
EDYCJA Właściwie łatwiej:
źródło
W moim systemie operacyjnym Scientific Linux 6 działa to:
Mam również Debian 32-bitowy zainstalowany na maszynie wirtualnej. Powyższe nie działa, ale następujące czynności:
źródło
find
rozwiązanie, które podałem, nie zadziałało?file.txt
ani nic innego?shopt
nie jesttcsh
wbudowany.Użyj
rm !("file.txt")
zamiastrm !(file.txt)
źródło
shopt -s extglob
. W każdym razie cytowanie takiej prostej nazwy pliku nie miałoby znaczenia.Aby dać inną odpowiedź, możesz użyć domyślnego zachowania,
rm
które nie spowoduje usunięcia folderów:źródło
Uważam, że to podejście jest bardzo proste, działa i nie wymaga żadnych specjalnych rozszerzeń (o których wiem!)
źródło