Muszę usunąć wszystkie pliki z katalogu, ale wykluczyć niektóre z nich. Na przykład w katalogu z plikami a b c ... zmuszę usunąć wszystkie oprócz ui 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 ... zmuszę usunąć wszystkie oprócz ui 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 rmwszystkich oprócz u,pbash 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 -rfopcje 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 1spowoduje, że find przetworzy tylko podany katalog ( finddomyś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 -printzamiast-delete
find . ! -name u ! -name p -maxdepth 1 -type f -print-deletezaraz po .nim będzie katastrofą (usunie wszystkie pliki w CWD)
find . -maxdepth 1 -type f -name '[^up]' -delete
findjest moim najlepszym przyjacielem, zwłaszcza gdy jest zbyt wiele plików do glob
Prosty:
mvpliki, które chcesz w górnym katalogu, rmw katalogu, a następnie z mvpowrotem.
rmbez -rnie 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.
-Ealboegrep
ulubp
grep -L (u|p)' * | xargs rmgdzie -Loznacza, że nazwy plików list nie zawierają dopasowania.
ulub pżaden plik zawierający a ulub 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 uiw pobecnym reż. Może to być przydatne w przypadku skryptów.
find -regextype posix-awk ! -regex './(u|p)' -print0 | xargs -0 rm -rf
-regextypebędzie działać tylko na wersjach GNU
findjest rozszerzeniem findpolecenia GNU . To samo dotyczy -regextypeopcji. 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 rmpoprosi, 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