Muszę usunąć wszystkie pliki z katalogu, ale wykluczyć niektóre z nich. Na przykład w katalogu z plikami a b c ... z
muszę usunąć wszystkie oprócz u
i p
. Czy jest na to łatwy sposób?
Muszę usunąć wszystkie pliki z katalogu, ale wykluczyć niektóre z nich. Na przykład w katalogu z plikami a b c ... z
muszę usunąć wszystkie oprócz u
i p
. Czy jest na to łatwy sposób?
Odpowiedzi:
W tych przypadkach piszę
rm *
Następnie naciskam Ctrl+ X, *aby rozwinąć *
do wszystkich widocznych nazw plików.
Następnie mogę po prostu usunąć z listy dwa pliki, które chcę zachować, i na koniec uruchomić wiersz poleceń.
*
rozwija, nie jest zbyt długa. : -}
Ctrl
+ Shift
+ x
+*
Do rm
wszystkich oprócz u,p
bash wystarczy wpisać:
rm !(u|p)
Wymaga to ustawienia następującej opcji:
shopt -s extglob
Zobacz więcej: glob - Wiki Grega
shopt -s extglob
, @Ashot. Poza tym to tylko pliki, a nie katalogi, dlatego usunąłem -rf
opcje z twojego polecenia.
rm !(index).html
. Spowoduje to usunięcie wszystkich plików z rozszerzeniem „.html”, z wyjątkiem „index.html”.
Możesz użyć find
find . ! -name u ! -name p -maxdepth 1 -type f -delete
!
neguje następne wyrażenie-name
określa nazwę pliku-maxdepth 1
spowoduje, że find przetworzy tylko podany katalog ( find
domyślnie katalogi przechodzą)-type f
będzie przetwarzać tylko pliki (a nie na przykład katalogi)-delete
usunie plikiNastępnie możesz dostroić warunki, patrząc na stronę podręcznika wyszukiwania
Aktualizacja
Przetestuj najpierw swoje polecenie, używając -print
zamiast-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print
-delete
zaraz po .
nim będzie katastrofą (usunie wszystkie pliki w CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
find
jest moim najlepszym przyjacielem, zwłaszcza gdy jest zbyt wiele plików do glob
Prosty:
mv
pliki, które chcesz w górnym katalogu, rm
w katalogu, a następnie z mv
powrotem.
rm
bez -r
nie usunie podkatalogów.
Trochę podobne do tej odpowiedzi, ale nie są potrzebne żadne specjalne opcje, o ile wiem, że „starożytna” funkcjonalność jest obsługiwana przez dowolną (niejasno) / bin / sh przypominającą powłokę (np. Bash, zsh, ksh itp.)
rm [^up]
rm [^up]*
? Często robię podobne rzeczy.
Robiąc to bez znalezienia:
ls | grep -v '(u|p)' | xargs rm
(Edycja: „u” i „v”, podobnie jak w innych miejscach tutaj, są używane jako ogólne wersje całych wyrażeń regularnych. Oczywiście musisz zachować ostrożność, aby zakotwiczyć wyrażenia regularne, aby uniknąć dopasowania zbyt wielu rzeczy.)
Zdecydowanie będziesz potrzebować skryptu, jeśli będziesz robić dużo z tego, jak sugerowali inni.
-E
alboegrep
u
lubp
grep -L (u|p)' * | xargs rm
gdzie -L
oznacza, że nazwy plików list nie zawierają dopasowania.
u
lub p
żaden plik zawierający a u
lub a p
. To jest poprawne. Możesz to naprawić za pomocąegrep -v '^(u|p)$'
ls | grep -v 'vuze\|progs' | xargs rm -rf
W erze dyskietek miałem plik wykonywalny dos o nazwie „Z wyjątkiem”, który tymczasowo przenosiłby rzeczy z bieżącego katalogu i wykonywał polecenie, aby można było powiedzieć:
oprócz * .txt del *. *
aby usunąć wszystko oprócz plików tekstowych.
Byłoby to dość trywialne zaimplementowanie jako skrypt powłoki, a jeśli jest to coś, co możesz zrobić więcej niż dwa razy, wydaje się, że byłby to dobry pomysł.
find . -maxdepth 1 ! -name "u" ! -name "p" -type f -exec rm -rf {} \;
Spowoduje to usunięcie wszystkich plików oprócz u i p w unixie
Dla tych, którzy wolą określać dowolne złożone wzorce wykluczania (obejmujące wszystkie zmienione nazwy plików) w pełnym stylu emacs wyrażenia regularnego, posix-awk lub rozszerzonym posix-em (zobacz stronę man) polecam ten. W tym przykładzie wyklucza u
iw p
obecnym reż. Może to być przydatne w przypadku skryptów.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextype
będzie działać tylko na wersjach GNU
find
jest rozszerzeniem find
polecenia GNU . To samo dotyczy -regextype
opcji. Ponadto twoje polecenie usunie również pliki z podkatalogów, podczas gdy pierwotne pytanie wyraźnie zadawało pytania dotyczące plików w katalogu.
Oto inny wariant. Możesz pisać:
rm -i *
lub:
rm --interactive *
Więc rm
poprosi, aby potwierdzić usunięcie każdego pliku.
Posługiwać się:
find . -type f ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
find . -type d ! -name 'u' ! -name 'p' ! -name '*.ext' -delete
w celu usunięcia wszystkich plików, w tym katalogów, z wyjątkiem plików u, p i .ext.
Prosty sposób, który trudno zepsuć: powiedzmy, że chcesz usunąć wszystko oprócz * .pdf:
mkdir tmp
mv *.pdf tmp
rm *
mv tmp/* .
rm -r tmp