Questo può essere fatto anche con xargs
e sed
per modificare l'estensione del file.
ls | grep \.png$ | sed 'p;s/\.png/\.jpg/' | xargs -n2 mv
Puoi stampare il nome del file originale insieme a quello che vuoi che sia il nome del file. Quindi chiedi a xargs di utilizzare questi due argomenti nel comando di spostamento. Per il one-liner, ho anche aggiunto un grep per filtrare tutto ciò che non è un file *.png.
come faccio a rinominare il file in modo che possa avere solo un'estensione.
cd dir/with/messedup/files
for file in *.png.jpg; do
mv "$file" "${file%.png.jpg}.jpg"
done
in futuro, usando xargs, come posso modificare l'estensione del file simular in second command?
Che io sappia, non si può fare. Il modo migliore per farlo sarebbe utilizzare un ciclo for con sostituzione di parametri molto simile a quello sopra:
for file in *.png; do
convert "$file" -resize "${file%.png}.jpg"
done
Se hai dei file nelle sottodirectory che vuoi convertire, puoi reindirizzare find
a un while read
ciclo:
find . -type f -name '*.png' |
while read file; do
convert "$file" -resize "${file%.png}.jpg"
done
NOTA: Generalmente è considerata una cattiva idea usare l'output di ls
in uno script di shell. Mentre il tuo esempio potrebbe aver funzionato bene, ci sono molti esempi in cui non funziona. Ad esempio, se i tuoi nomi di file contengono una nuova riga (cosa che unix consente), ls
probabilmente non sfuggirà a quelli per te. (Questo in realtà dipende dalla tua implementazione, che è un altro motivo per non usare ls
negli script; il suo comportamento varia notevolmente da una casella all'altra.) Otterrai risultati più coerenti se utilizzi find
in un ciclo while-read o file globbing (ad es. *.png
) in un ciclo for.