Wszystkie obrazy jpg
mogę uzyskać za pomocą:
find . -name "*.jpg"
Ale jak mogę dodać również pliki png
do wyników?
Komentarze
Odpowiedź
Użyj flagi -o
między różnymi parametrami.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
działa jak urok.
UWAGA Między nawiasem a jego zawartością musi być spacja lub to nie zadziała.
Wyjaśnienie:
-
-type f
– szukaj tylko plików (nie katalogów) -
\(
&\)
– są potrzebne, aby element-type f
miał zastosowanie do wszystkich argumentów -
-o
– logiczne LUB operator -
-iname
– jak-name
, ale w dopasowaniu nie jest rozróżniana wielkość liter
Komentarze
- Czy potrzebujesz nawiasów. Polecenie działa dla mnie bez nich. Czy są potrzebne do niektórych powłok?
- @miked Polecenie " będzie działać " bez nich, tak, ale you ' d kończy się otrzymywaniem trafień w katalogach kończących się na .png, a także w plikach kończących się na .jpg, co nie jest dokładnie tym, co było zamierzone.
- Dzięki za wytłumaczenie!
type -f
nie rozszerza się i nie ma zastosowania do obu wyrażeń bez nawiasów, więcfind ./ -type f -iname \*.jpg -o -type f -iname \*.png
również działa … chociaż ' to dwa znaki dłuższe 🙂 - To ' jest kwestią pierwszeństwa operatorów. Tak jak
a * b + c
różni się oda * (b + c)
- @jdhao Dobry chwyt, poprawiony.
Odpowiedź
Możesz łączyć kryteria z -o
jako zasugerowany przez Shadur . Zwróć uwagę, że -o
ma niższy priorytet niż zestawienie, więc możesz potrzebować nawiasów.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
W Linuksie możesz użyj -regex
, aby połączyć rozszerzenia w bardziej zwięzły sposób. Domyślna składnia wyrażeń regularnych to Emacs ( podstawowe wyrażenia regularne plus kilka rozszerzeń, takich jak \|
dla alternacji); istnieje opcja przełączenia się na rozszerzone wyrażenia regularne .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
We FreeBSD, NetBSD i OSX, możesz użyć -regex
w połączeniu z -E
dla rozszerzonych wyrażeń regularnych.
find -E . -regex ".*\.(jpg|png)"
Komentarze
- Zawsze lepiej ' używać
-iname
zamiast-name
– wtedy przechwycisz takżeimage.JPG
iimage.PnG
Odpowiedź
To jest bardziej poprawne:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Komentarze
- Dlaczego twierdzisz, że " więcej " jest poprawne?
- @Kevin chyba, ponieważ
-iregex
pasuje dojpg
, a także doJPG Jpg jpG
i tym podobne. Myślę, że$
nie jest ' t potrzebne . - Działa to dobrze na MinGW .
- Najpierw pominąłeś folder wyszukiwania jako pierwszy argument, który spowoduje wyświetlenie błąd. Po drugie, w OSX zmiana znaczenia nawiasów nie będzie działać i zamiast tego należy użyć tego:
find -E . -iregex '.*\.(jpg|png|gif)'
jak pokazano w odpowiedzi @sorin '.
Odpowiedź
Aby było jasne, jedyną opcją działającą w wersjach Linux, Unix i macOS jest:
find -E . -regex ".*\.(jpg|png)"
Dzieje się tak dlatego, że wersja OS X jest nieco inna, ale jest to ważne, aby pisać rzeczy, które działają dobrze na większości platform.
Komentarze
- Flaga -E nie działa w przypadku wyszukiwania w Ubuntu 14.04
- Flaga -E nie działa na MinGW (przynajmniej wersja / konfiguracja, na której go wypróbowałem (domyślna konfiguracja dla określonej wersji)).
- Która część nie działa na OSX?
- Czy mogę potwierdzić, że
-type f \( -iname \*.png -o -iname \*.jpg\)
działa na OSX
Odpowiedź
/\.(jpe?g|png|gif|bmp)$/i;
Wykorzystaj.
Komentarz s
- Być może trzeba będzie trochę to wyjaśnić.
find -name
wzorzec pasujący do wielu wzorców pod adresem WIĘCfind . | egrep '.jpg|.png'
.