Non li ho testati, quindi inserisco echo
nella parte anteriore dei comandi in modo da poterli provare prima di rimuovere l'eco per eseguirli sul serio.
for f in *v9.zip; do echo mv "${f}" "${f%v9.zip}.zip"; done
for f in *_*; do echo mv "${f}" "${f//_/-}"; done
Per quanto riguarda il tuo terzo problema, sono sicuro che si possa fare anche questo, ma forse un approccio più sofisticato rispetto alle prime battute della shell ti aiuterà, come ha detto @tchrist.
C'è un rename
comando fornito con la maggior parte delle distribuzioni basate su Debian/Ubuntu, scritto da Robin Barker sulla base del codice originale di Larry Wall del 1998 circa (!).
Ecco un estratto dalla documentazione:
"rename" renames the filenames supplied according to the rule specified as the first argument. The perlexpr argument is a Perl expression which is expected to modify the $_ string in Perl for at least some of the filenames specified. If a given filename is not modified by the expression, it will not be renamed. If no filenames are given on the command line, filenames will be read via standard input. For example, to rename all files matching "*.bak" to strip the extension, you might say rename 's/\.bak$//' *.bak To translate uppercase names to lower, you'd use rename 'y/A-Z/a-z/' *
Utilizza perl in modo da poter utilizzare le espressioni perl per abbinare il pattern, infatti credo che funzioni in modo molto simile agli script di tchrist.
Un altro set di strumenti davvero utile per la ridenominazione di file in blocco è la raccolta renameutils di Oskar Liljeblad. Il codice sorgente è ospitato dalla Free Software Foundation. Inoltre molte distribuzioni (specialmente quelle basate su Debian/Ubuntu) hanno un renameutils
pacchetto con questi strumenti.
Su una di queste distribuzioni puoi installarlo con:
$ sudo apt-get install renameutils
E poi per rinominare i file basta eseguire questo comando:
$ qmv
Si aprirà un editor di testo con l'elenco dei file e potrai manipolarli con la funzione di ricerca e sostituzione del tuo editor.
La mia soluzione preferita è la mia rinomina copione. L'esempio più semplice che corrisponde ai tuoi problemi è questo:
% rename 's/_/-/g' *
% rename 's/(\p{Lower})(\p{Upper})/$1 $2/g' *
Anche se odio davvero gli spazi bianchi nei miei nomi di file, in particolare gli spazi bianchi verticali:
% rename 's/\s//g' *
% rename 's/\v//g' *
eccetera. È basato su una sceneggiatura di The Larry Wall, ma ampliato con opzioni, come in:
usage: /home/tchrist/scripts/rename [-ifqI0vnml] [-F file] perlexpr [files]
-i ask about clobbering existent files
-f force clobbers without inquiring
-q quietly skip clobbers without inquiring
-I ask about all changes
-0 read null-terminated filenames
-v verbosely says what its doing
-V verbosely says what its doing but with newlines between old and new filenames
-n don't really do it
-m to always rename
-l to always symlink
-F path read filelist to change from magic path(s)
Come puoi vedere, può cambiare non solo i nomi dei file, ma dove puntano i collegamenti simbolici usando lo stesso schema. Non devi usare un s///
modello, anche se spesso lo si fa.
Gli altri strumenti in quella directory sono principalmente per il lavoro Unicode, di cui ce ne sono alcuni super utili.