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žefind ./ -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ší oda * (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íteimage.JPG
aimage.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
iJPG 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.
find -name
vzor, který odpovídá více vzorům na SOfind . | egrep '.jpg|.png'
a lot.