Trouver tous les .mp4 et renommer .audio

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'`; }