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ęc find ./ -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ę od a * (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że image.JPG i image.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 do jpg, a także do JPG 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ć.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *