W bash często używam pętli for, takich jak następujące
for file in *.type; do
sommecommand "$file";
done;
wykonać operację dla wszystkich pasujących plików *.type
. Jeśli w katalogach roboczych nie zostanie znaleziony plik z takim zakończeniem, gwiazdka nie zostanie rozwinięta i zwykle pojawia się komunikat o błędzie informujący, że ktoś nie znalazł pliku. Mogę od razu wymyślić kilka sposobów uniknięcia tego błędu. Ale dodanie warunku nie wydaje się zbyt eleganckie. Czy istnieje krótki i czysty sposób na osiągnięcie tego?
*.txt
. Warto sprawdzić, czy plik istnieje.break
zamiastcontinue
).W bash możesz użyć,
shopt -s nullglob
aby rozwinąć do pustej tablicy, jeśli nie ma żadnych dopasowań.W powłokach POSIX bez
nullglob
tego problemu można uniknąć tego problemu, sprawdzając, czy przekazywana nazwa pliku rzeczywiście istnieje,[ -e "$file" ] || [ -L "$file" ] || continue
jako pierwsza częśćfor
pętli.źródło
[ -e
zwróciłby wartość false dla niedostępnych plików lub plików, które są dowiązaniami symbolicznymi do niedostępnych lub nieistniejących plików.chmod 0 the_file
,[ -e the_file ]
nadal ocenia prawda, więc to musi być coś innego.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
. x / a jest niedostępny, ale ponieważ x jest czytelny, x / * będzie się rozwijał.Zwykłą techniką dla pocisków, które nie mają
nullglob
opcji, jestDodatkowym
[*].type
jest pokrycie przypadku, w którym*.type
w bieżącym katalogu znajduje się jeden plik .Teraz, jeśli chcesz dołączyć pliki kropkowe, staje się to bardziej skomplikowane .
Wierzę, że technika ta została wymyślona przez Laurę Fairhead na usenet kilka lat temu.
źródło
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
To
for
całkowicie usuwa pętlę i globowanie skorupy z równania.find
wykona-exec
polecenie raz na mecz, a jeśli nie ma żadnych dopasowań, nigdy nie zostanie wykonane. W-maxdepth 0
przesyła zlecenie znaleźć nie rekursja do podkatalogów o nazwie path-argumentu (.
w tym przypadku).Minusem jest to, że wiąże się z inną aplikacją, choć taką, która jest obecna na praktycznie każdym systemie Linux (i prawdopodobnie także na większości Uniksów).
źródło