To lze také provést pomocí xargs
a sed
pro změnu přípony souboru.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Můžete vytisknout původní název souboru spolu s tím, co chcete, aby byl název souboru. Pak nechte xargs použít tyto dva argumenty v příkazu move. Pro jeden řádek jsem také přidal grep pro odfiltrování všeho, co není soubor *.png.
jak přejmenuji soubor, abych mohl mít pouze jednu příponu.
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
Jak v budoucnu pomocí xargs změním příponu souboru simular na druhý příkaz?
Podle mých informací to nelze. Nejlepší způsob, jak to udělat, by bylo použít for-loop se substitucí parametrů podobně jako výše:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Máte-li v podadresářích soubory, které chcete převést, můžete použít kanál find
na while read
smyčka:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
POZNÁMKA: Obecně se považuje za špatný nápad používat výstup ls
ve skriptu shellu. I když váš příklad mohl fungovat dobře, existuje mnoho příkladů, kdy ne. Pokud například vaše názvy souborů náhodou obsahují nové řádky (což unix umožňuje), ls
těm vám asi neuniknou. (To ve skutečnosti závisí na vaší implementaci, což je další důvod, proč nepoužívat ls
ve skriptech; jeho chování se velmi liší od jednoho pole k druhému.) Shodnějších výsledků získáte, pokud použijete find
ve smyčce při čtení nebo v globování souborů (např. *.png
) ve smyčce for.