Jak powinienem wyświetlić listę wszystkich katalogów, w których nie ma pliku o podanej nazwie? np. biorąc pod uwagę to drzewo
/
/a
README
file001
file002
/b
README
file001
/c
file003
Chcę wymienić katalogi, które nie mają nazwanych plików README
, w tym przypadku byłby to katalog /c
. Jak mam to zrobić? Nie mogę wymyślić żadnej składni używającej np find
.
Odpowiedzi:
Zakładając
find
implementację taką jak GNU,find
która akceptuje{}
osadzony w argumencie-exec
:Przykład
Tutaj katalogi od 1/1 do 5/5 mają CZYTNIK, pozostałe katalogi są puste.
Teraz, gdy uruchomimy tę wersję naszego
find
polecenia:Bibliografia
źródło
Możesz użyć
-exec
opcjifind
sprawdzenia pliku, a następnie wydrukować wszystkie wyniki, dla których sprawdzenie się nie powiedzie.źródło
Nie ma potrzeby
find
. Wystarczy użyć powłoki:Jeśli jest to potrzebne, aby być rekurencyjny, można użyć (na
bash
,zsh
można to zrobić domyślnie używająset -o globstar
wksh93
):(zwróć uwagę, że pliki kropek są domyślnie wyłączone).
źródło
Z kwalifikatorami
zsh
i glob (e
ciąg ):lub
dodaj,
D
aby uwzględnić ukryte katalogi:/
wybiera tylko katalogi ie_'[[ ! -f $REPLY/README ]]'_
dalej wybiera tylko nazwy katalogów, dla których zwraca kod powłoki między cudzysłowamitrue
, to znaczy dla każdej nazwy katalogu ($REPLY
), do której*(/)
rozwija się glob , uruchamia[[ ! -f $REPLY/README ]]
i zachowuje nazwę katalogu, jeśli wynik jesttrue
.Druga forma
^e_'.....'_
używa tego samego kwalifikatora globalnego, negowanego (ale tym razem wyrażenie warunkowe nie jest negowane:)[[ -f $REPLY/README ]]
.Powyższe zwróci tylko nazwy katalogów w bieżącym katalogu.
Jeśli chcesz wyszukiwać rekurencyjnie (ponownie, aby uwzględnić ukryte katalogi, dodaj
D
kwalifikator):źródło
Przenośnie możesz zrobić:
[ -f file ]
sprawdza, czy plik istnieje i czy jest normalny (po rozpoznaniu dowiązania symbolicznego).Jeśli chcesz przetestować, czy istnieje tylko (jako wpis w tym katalogu), niezależnie od jego typu, potrzebujesz:
[ -e file ] || [ -L file ]
chociaż pamiętaj, że do wykonania tych testów potrzebujesz uprawnień do wyszukiwania w katalogu. Możesz dodać kilka[ -x "$dir" ]
testów, aby uwzględnić takie przypadki, jak:Lub, aby uniknąć wyścigu, stosując
zsh
:Zobacz także Jak sprawdzić, czy zwykły plik nie istnieje w Bash? Na tak.
źródło