J'ai donc un script qui ajoute 2 films set en utilisant l'audio du file $1.audio
. Ce que je voudrais faire est de renommer n'importe quel file dans le directory avec:
*.mp4
À:
*.audio
Garder le nom du file d'origine.
Vous pouvez utiliser la command rename
. Ce n'est pas portable, mais il existe sous différentes forms dans différentes dissortingbutions.
Dans CentOS / RHEL et probablement Fedora:
rename .mp4 .audio *.mp4
Devrait le faire. De l' man rename
sur CentOS 6:
SYNOPSIS rename from to file... rename -V DESCRIPTION rename will rename the specified files by replacing the first occur- rence of from in their name by to.
Dans Ubuntu et probablement n'importe quelle variante de Debian:
rename 's/\.mp4$/.audio/' *.mp4
devrait le faire. De l' man rename
sur Ubuntu 14.04:
SYNOPSIS rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] DESCRIPTION "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 $_ ssortingng 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 ssortingp the extension, you might say rename 's/\.bak$//' *.bak
Voici une solution rapide et portable qui gère toujours des files étrangement nommés:
find . -name "*.mp4" -exec sh -c 'for i do mv -- "$i" "${i%.mp4}.audio"; done' sh {} +
Utilisez ceci for
boucle:
for f in *; do [ -f "$f" ] && mv -v -- "$f" "${f%.mp3}.audio" done
for i in *
boucle tous les files et directorys (sauf les files point) dans le directory de travail en cours et stocke le file traité en cours dans $f
[ -f "$f" ]
vérifie si c'est un file régulier mv -v
renomme le file ( --
est que les noms de files ne seront pas interprétés comme des arguments par erreur) ${f%.mp3}.audio
supprime l'extension .mp3
et ajoute l'extension .audio
( Expansion des parameters ) Voici une solution qui utilise find
, sed
et xargs
. Cette solution fonctionne même s'il y a des espaces dans le nom.
Il obtient d'abord les files en utilisant find
. Ensuite, obtient le nom de base du file en utilisant sed
. Enfin, il fait le mouvement pour changer l'extension.
Notez que le code ci-dessous est multiligne pour plus de clarté. Vous devriez probablement l'exécuter sur une seule ligne.
# split into three lines for clarity # should execute as one line find . -maxdepth 1 -name '*.mp4' | sed -r 's/.*\/([^/]+)\.mp4/\1/g' | xargs -ix mv "x.mp4" "x.audio"
Voici une solution alternative utilisant basename
. Cette solution peut fonctionner avec des noms contenant des espaces (n'ont pas testé celui-ci).
Il obtient d'abord tous les files avec l'extension .mp4
, puis obtient le nom de base, et finalement renomme chacun avec l'extension audio.
# split into three lines for clarity # should execute as one line find . -maxdepth 1 -name '*.mp4' -print0 | xargs -0 -ix basename "x" .mp4 | xargs -ix mv "x.mp4" "x.audio"
Vous pouvez utiliser
for file in `ls *.mp4`; { mv $file `echo $file | sed 's/.mp4/.audio/g'`; }