Chcę wyświetlić wszystkie katalogi, które nie zawierają plików z konkretnym zakończeniem. Dlatego próbowałem użyć następującego kodu:
find . -type d \! -exec test -e '{}/*.ENDING' \; -print
W tym przykładzie chciałem wyświetlić wszystkie katalogi, które nie zawierają plików z końcówką .ENDING
, ale to nie działa.
Gdzie jest mój błąd?
Odpowiedzi:
Oto rozwiązanie w trzech krokach:
źródło
comm -3 <(find . -type f -name \*ENDING -exec dirname {} \; |sort -u) <(find . -type d |sort -u)
No to ruszamy!
Lub naprzemiennie (i bardziej pythonowo):
Dodatkowa zawartość DLC!
(Przeważnie) poprawiona wersja polecenia find:
źródło
test: ...: binary operator expected
jeśli*.ENDING
w katalogu jest wiele plików.next(filter(lambda x: x.endswith('.ENDING'), filenames))
można również napisać przy użyciu zrozumienia generatora, tjnext(x for x in filenames if x.endswith('.ENDING'))
.if not any(x.endswith('.ENDING') for x in filenames)
oparciu o fakt, że wszelkie zwrotyFalse
dla pustego iterowalnego.Powłoka rozszerza
*
, ale w twoim przypadku nie ma w niej udziału, wystarczy polecenie testowe wykonane przez find . Dlatego plik, którego istnienie jest testowane, ma dosłownie nazwę*.ENDING
.Zamiast tego powinieneś użyć czegoś takiego:
Spowodowałoby to rozszerzenie sh
*.ENDING
podczas wykonywania testu .Źródło: znajdź globbing na UX.SE
źródło
-c: line 0: syntax error near unexpected token
(''. Moje nazwy katalogów mają format 'xyz (dfdf)'. W rzeczywistości jest to biblioteka kalibru.sh: line 0: test: foo1/bar.ENDING: binary operator expected
katalogu zawierającego plik z końcówkąENDING
.sh: -c: line 0: syntax error near unexpected token
('sh: -c: linia 0:' test -e test (test) / *. Ending ''). / test (test) `. Ale kiedy zmieniam .ending do .xyz, otrzymuję ten sam wynik. To dlatego, że mam przylistki jako nazwę katalogu, prawda? Jak to naprawić?Zainspirowany odpowiedziami Dennisa Nolte i MikeyB wymyśliłem to rozwiązanie:
Działa w oparciu o fakt, że
Nawiasem mówiąc, właśnie dlatego przekierowano stderr
/dev/null
.źródło
Zrobiłbym to w Perlu osobiście
Powinien zrobić lewę (działa na moim bardzo uproszczonym przypadku testowym).
źródło
Oto znaleziona jedna linijka.
find ./ -type d ! -regex '.*.ENDING$' -printf "%h\n" | sort -u
Edycja : Ups, też nie będzie działać.
źródło
q
w egrep jest cichoZa pomocą
egrep
możesz zamienić regex, którego potrzebujeszls -1 "{}"
wyświetla nazwy plików z polecenia findźródło