Snažím se v současné době přejmenovat velkou sadu souborů a používám k tomu docela nešikovné metody, jako například:
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Co bych opravdu rád udělal, je umět kombinovat všechny tyto příkazy pomocí „y“ sed
operátor. Je zřejmé, že pomocí tohoto operátoru můžete transformovat položky na malá písmena. Problém je, že potřebuji převést pouze rozšíření. Existuje způsob, jak to provést pomocí tohoto příkazu? Potřebuji v podstatě transformovat skupinu zachycení v následujícím výrazu na malá písmena:^.+.(.+)$
. Existuje způsob, jak to udělat? Jsem v těchto typech přeměn tak trochu nový.
Přijatá odpověď:
To je rename
založené na Perlu nalezený na Debianu, Ubuntu a derivátech, soudě podle syntaxe. Nemůžete použít tr
operátor, protože působí na celý řetězec. Ale můžete příponu porovnat a malá písmena ji použít jako L
.
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Zde je to zbytečné, ale pokud se regulární výraz shodoval více než část, kterou chcete psát malými písmeny, můžete část, kterou chcete porovnat, umístit do skupiny:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Nahraďte *.JPG *.MOV
podle *.*
pracovat se všemi soubory bez ohledu na příponu. V bash ≥4.3 (a také v bash 4.0–4.2, s upozorněním, že to také prochází symbolické odkazy na adresáře), můžete snadno pracovat se soubory v podadresářích a tak dále rekurzivně:
rename 's/.[^.]*$/L$&/' **/*.*
Pro fanoušky zsh (:r
a :e
modifikátory izolují příponu od zbytku souboru):
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal