Mohu získat všechny jpg obrázky pomocí:

find . -name "*.jpg" 

Jak ale mohu přidat do výsledků i soubory png?

Komentáře

Answer

Mezi různými parametry použijte příznak -o.

find ./ -type f \( -iname \*.jpg -o -iname \*.png \) funguje jako kouzlo.

POZNÁMKA Mezi závorkou a jejím obsahem musí být musí mezera nebo nebude fungovat.

Vysvětlení:

  • -type f – vyhledávat pouze soubory (ne adresáře)
  • \( & \) – je potřeba, aby se -type f použila na všechny argumenty
  • -o – logické NEBO operátor
  • -iname – jako -name, ale ve shodě se nerozlišují velká a malá písmena

Komentáře

  • Potřebujete závorky. Příkaz pro mě funguje bez nich. Jsou potřebné pro nějaké granáty?
  • @miked Příkaz bude " fungovat " bez nich, ano, ale ' byste nakonec dostali zásahy do adresářů, které končí v .png, i souborů, které končí na .jpg, což není přesně to, co bylo zamýšleno.
  • Děkujeme za objasnění! type -f se nerozšíří a nevztahuje se na oba výrazy bez závorek, takže find ./ -type f -iname \*.jpg -o -type f -iname \*.png také funguje … ačkoli ' o dva znaky déle 🙂
  • Je to ' priorita operátora. Stejně jako a * b + c se liší od a * (b + c)
  • @jdhao Dobrý úlovek, pozměněno.

Odpověď

Kritéria můžete kombinovat s -o jako navrhl Shadur . Pamatujte, že -o má nižší prioritu než juxtapozice, takže možná budete potřebovat závorky.

find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week 

V systému Linux můžete použijte -regex ke kombinování rozšíření terser způsobem. Výchozí syntaxe regexp je Emacs ( základní regexps plus několik rozšíření, například \| pro alternaci); existuje možnost přepnout na rozšířené regulární výrazy .

find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)" 

Na FreeBSD, NetBSD a OSX můžete použít -regex v kombinaci s -E pro rozšířené regulární výrazy.

find -E . -regex ".*\.(jpg|png)" 

Komentáře

  • ' Je vždy lepší použít -iname místo -name – pak také zachytíte image.JPG a image.PnG

Odpověď

To je správnější:

find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$" 

Komentáře

  • Proč říkáte, že je " více " správné?
  • @Kevin Myslím, že -iregex odpovídá jpg i JPG Jpg jpG a podobně. Myslím, že $ není ' potřeba .
  • Toto funguje dobře na MinGW .
  • Nejprve jste vynechali složku hledání jako první argument, který vyvolá chyba. Zadruhé, v OSX nebude únik závorky fungovat, a místo toho by měl být použit: find -E . -iregex '.*\.(jpg|png|gif)' jak je ukázáno v odpovědi @sorin '.

Odpověď

Aby bylo jasno, jediná možnost, která funguje v systémech Linux, Unix a macOS, je:

find -E . -regex ".*\.(jpg|png)" 

Je tomu tak proto, že verze OS X je trochu jiná, ale je důležité psát věci, které na většině platforem dobře fungují.

Komentáře

  • Příznak -E není platný pro hledání v Ubuntu 14.04
  • Příznak -E není platný pro MinGW (alespoň verze / konfigurace, kterou jsem vyzkoušel (výchozí konfigurace pro konkrétní verzi)).
  • Která část -type f \( -iname \*.png -o -iname \*.jpg\) nefunguje na OSX?
  • Může potvrdit, že -type f \( -iname \*.png -o -iname \*.jpg\) funguje na OSX

Odpověď

/\.(jpe?g|png|gif|bmp)$/i; 

Použijte jej.

Komentář s

  • Možná to budete muset trochu vysvětlit.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *