Ik kan alle jpg
afbeeldingen krijgen met:
find . -name "*.jpg"
Maar hoe kan ik ook png
bestanden aan de resultaten toevoegen?
Opmerkingen
Antwoord
Gebruik de -o
vlag tussen verschillende parameters.
find ./ -type f \( -iname \*.jpg -o -iname \*.png \)
werkt uitstekend.
OPMERKING Er moet een spatie zijn tussen de haakjes en de inhoud ervan of het zal “niet werken.
Uitleg:
-
-type f
– zoek alleen naar bestanden (niet naar mappen) -
\(
&\)
– zijn nodig om de-type f
toe te passen op alle argumenten -
-o
– logisch OF operator -
-iname
– zoals-name
, maar de overeenkomst is niet hoofdlettergevoelig
Opmerkingen
- Heb je de haakjes nodig? Het commando werkt voor mij zonder hen. Zijn ze nodig voor sommige shells?
- @miked Het commando zal " werken " zonder hen, ja, maar je ' zou uiteindelijk hits krijgen op mappen die eindigen op .png en op bestanden die eindigen op .jpg, wat niet precies is wat de bedoeling was.
- Bedankt voor het verduidelijken! De
type -f
is niet van toepassing op beide expressies zonder de haakjes, dusfind ./ -type f -iname \*.jpg -o -type f -iname \*.png
werkt ook … hoewel het ' is twee tekens langer 🙂 - Het ' is een kwestie van prioriteit van de operator. Net zoals
a * b + c
verschilt vana * (b + c)
- @jdhao Goede vangst, gewijzigd.
Antwoord
U kunt criteria combineren met -o
als voorgesteld door Shadur . Merk op dat -o
een lagere prioriteit heeft dan juxtapositie, dus je hebt wellicht haakjes nodig.
find . -name "*.jpg" -o -name "*.png" find . -mtime -7 \( "*.jpg" -o -name "*.png" \) # all .jpg or .png images modified in the past week
Onder Linux kun je gebruik -regex
om extensies op een kortere manier te combineren. De standaard regexp-syntaxis is Emacs ( basisregexps plus een paar extensies zoals \|
voor afwisseling); er is een optie om over te schakelen naar uitgebreide regexps .
find -regex ".*\.\(jpg\|png\)" find -regextype posix-extended -regex ".*\.(jpg|png)"
Op FreeBSD, NetBSD en OSX, kunt u -regex
gebruiken in combinatie met -E
voor uitgebreide regexps.
find -E . -regex ".*\.(jpg|png)"
Reacties
- Het ' is altijd beter om
-iname
in plaats van-name
– dan leg je ookimage.JPG
enimage.PnG
vast
Antwoord
Dit is correcter:
find . -iregex ".*\.\(jpg\|gif\|png\|jpeg\)$"
Opmerkingen
- Waarom zegt u dat het " meer " correct is?
- @Kevin denk ik omdat
-iregex
overeenkomt metjpg
evenalsJPG Jpg jpG
en dergelijke. Ik denk dat de$
niet ' t nodig is . - Dit werkt prima op MinGW .
- Ten eerste heb je de zoekmap weggelaten als eerste argument dat zal genereren een fout. Ten tweede, op OSX zal het ontsnappen van de haakjes niet werken, en dit zou in plaats daarvan moeten worden gebruikt:
find -E . -iregex '.*\.(jpg|png|gif)'
zoals getoond in het antwoord van @sorin '.
Antwoord
Om het duidelijk te maken, is de enige optie die werkt op Linux, Unix en macOS-smaak:
find -E . -regex ".*\.(jpg|png)"
Dat komt omdat de OS X-versie een beetje anders is, maar dat is belangrijk om dingen te schrijven die goed gaan op de meeste platforms.
Reacties
- -E-vlag is niet geldig voor zoeken op Ubuntu 14.04
- De -E-vlag is niet geldig op MinGW ofwel (tenminste de versie / configuratie waarop ik het probeerde (standaardconfiguratie voor een bepaalde versie)).
- Welk deel van
-type f \( -iname \*.png -o -iname \*.jpg\)
werkt niet op OSX? - Kan bevestigen dat
-type f \( -iname \*.png -o -iname \*.jpg\)
werkt op OSX
Antwoord
/\.(jpe?g|png|gif|bmp)$/i;
Gebruik het.
Commentaar s
- Misschien moet je dit een beetje uitleggen.
find -name
patroon dat overeenkomt met meerdere patronen op DUSfind . | egrep '.jpg|.png'
veel.