Hle, zajímavý problém - nebo požadavek, chcete-li. Máte složku plnou obrázků, řekněme desítky nebo stovky. A mají různé velikosti, řekněme výšku 480 nebo 600 nebo 1024 pixelů a šířku 200, 320 nebo 9000 pixelů, a vy byste chtěli z této složky zkopírovat pouze vysoce kvalitní obrázky velké velikosti do samostatného umístění. . Dělat to ručně může být oříšek.
V tomto článku bych vám rád ukázal poměrně jednoduchý příkaz, který můžete spustit v okně terminálu a který vám umožní odfiltrovat obrázky podle velikosti a poté zkopírovat pouze ty s atributem, který se vám líbí. Nyní si prosím uvědomte, že existují desítky různých způsobů, jak toho dosáhnout, a moje řešení není nijak jedinečné nebo komplexní (pro každý možný případ použití), ale mělo by to stačit. Začněme.
Obchodní nástroje
Jedinou aplikací, kterou budete potřebovat, kromě různých výchozích nástrojů příkazového řádku Linuxu, je ImageMagick, což je balíček/sada nástrojů pro zpracování obrázků. Je nainstalován ve většině distribucí ihned po vybalení, takže ve většině scénářů nebudete muset nic dělat.
Jedna vložka
Nyní potřebujete tento příkaz:
ls *.FFF | xargs -I{} identifikuje -formát '%i %w %h\n' {} | grep -w XXX | awk '{print $1}' | grep -v ^$ | xargs -I cp {} "cílová složka"
Co to tady máme?
Zde je rozpis různých akcí:
- Nejprve vypíšeme všechny soubory s příponou FFF (*.FFF) v aktuální složce. Můžete to samozřejmě změnit na libovolný adresář, který se vám líbí, nebo použít sofistikovanější metodu k nalezení/umístění souborů, jako je příkaz find.
- Potom použijeme xargs s náhradou řetězce a přeneseme názvy do nástroje pro identifikaci sady ImageMagick, který zpracuje každý název souboru a vytiskne atributy ve formátu '%i %w %h\n', což znamená:název souboru, šířka, výška, znak nového řádku, takže výstup pro každý záznam oddělíme. Zde máte svobodu projevu – můžete hledat pouze šířku, výšku nebo jiné vlastnosti!
- Potom grepujeme položky celého slova (-w), které odpovídají určité velikosti, např.:šířka (640). Pokud chcete, můžete egrep zachytit více hodnot nebo dokonce použít regulární výrazy.
- Dále tiskneme pouze názvy souborů, které odpovídají výše uvedenému kvalifikátoru grep. První hodnotu ve skutečnosti vytiskneme pomocí awk, protože výstupem příkazu je ve skutečnosti název souboru šířka výška znak nového řádku, jako v:
soubor1.jpg 640 480
soubor2.jpg 320 200
- Dále odfiltrujeme všechny prázdné řádky – při mém testování někdy identifikuji, že by se vytiskly prázdné řádky, takže je v našich výsledcích nechceme.
- Názvy souborů pak znovu předáme xargs a zkopírujeme je do cílové složky, která musí existovat. Používáme volbu -I (můžete také použít zastaralou volbu -i), abychom se ujistili, že jsou názvy souborů správně analyzovány. Pokud ne, můžete narazit na následující chybu:
cp:target './file.jpg' není adresář
Dvouvrstvá
Výše uvedené by mělo fungovat skvěle, ale pokud narazíte na problém kvůli jemným rozdílům ve způsobu, jakým nástroje analyzují názvy souborů, prázdné řádky a znaky nového řádku, můžete jednořádkový řádek zjednodušit na dvouřádkový, kde nejprve zapíšete výsledky do textový soubor a poté analyzujte textový soubor pro kopírování:
ls *.FFF | xargs -I{} identifikuje -formát '%i %w %h\n' {} | grep -w XXX | awk '{print $1}' | tee list.txt
seznam koček.txt | grep -v ^$ | xargs -I cp {} "cílová složka"
Například zkopírujeme všechny obrázky PNG s kterýmkoli rozměrem nastaveným na 800 px:
ls *.png | xargs -I{} identifikuje -formát '%i %w %h\n' {} | grep -w 800 | awk '{print $1}' | tee list.txt
seznam koček.txt | grep -v ^$ | xargs -I cp {} ./dir-only-big-files
Závěr
Tam. Nyní jsem si jistý, že můžete navrhnout tucet různých metod a vylepšení, které dosáhnou stejného, možná ještě elegantněji než to, co jsem napsal. Pokud ano, pošlete mi e-mail se svými návrhy a já je možná přidám do tohoto tutoriálu. Účelem tohoto článku není být svatým grálem skriptologie, ale jednoduchým řešením pro běžnou potřebu. A dělá to dobře.
Každopádně, pokud máte spoustu obrázků, fotografií, screenshotů, čehokoli, různých velikostí a atributů, můžete je chytrým způsobem odfiltrovat pomocí příkazového řádku Linuxu, plus příkaz ImageMagick identifikovat. Mluvíme dokonce o věcech, jako je velikost, barevné mapování a další. Hluk. Doufejme, že to pro vás bude užitečné. Opatruj se.