J'ai un script bash que j'essaie d'obtenir pour remplacer les points dans les noms de fichiers et les remplacer par des traits de soulignement, en laissant l'extension intacte (je suis sur Centos 6 btw). Comme vous pouvez le voir sur la sortie ci-dessous, le script fonctionne lorsqu'il y a un point à remplacer, mais dans les cas où le seul point est l'extension, le script essaie toujours de renommer le fichier, au lieu de l'ignorer. Quelqu'un peut-il indiquer comment je devrais mieux gérer cela? Merci pour toute aide.
Mon script (défectueux):
#!/bin/bash
for THISFILE in *
do
filename=${THISFILE%\.*}
extension=${THISFILE##*\.}
newname=${filename//./_}
echo "mv $THISFILE ${newname}.${extension}"
#mv $THISFILE ${newname}.${extension}
done
Exemple d'entrée:
1.3MN-Pin-Eurotunnel-Stw505.51.024-EGS-130x130.jpg
Wear-Plates.jpg
Production:
mv 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg 1_3MN-Pin-Eurotunnel-Stw505_51_024-EGS1-130x130.jpg
mv Wear-Plates_jpg.Wear-Plates_jpg Wear-Plates_jpg.Wear-Plates_jpg
tar.gz
fichiers? Vous voudriez qu'ils se résolventfile.tar.gz
, nonfile_tar.gz
.Réponses:
Je crois que ce programme fera ce que vous voulez. Je l'ai testé et cela fonctionne sur plusieurs cas intéressants (comme aucune extension du tout):
Le principal problème que vous aviez était que l'
##
expansion ne faisait pas ce que vous vouliez. J'ai toujours considéré l'expansion des paramètres du shell dans bash comme un art noir. Les explications contenues dans le manuel ne sont pas complètement claires et il leur manque des exemples à l'appui du fonctionnement de l'extension. Ils sont également assez cryptiques.Personnellement, j'aurais écrit un petit script dans
sed
lequel je bidouillerais le nom comme je le voulais, ou j'aurais écrit un petit script dansperl
lequel je ferais tout. L'une des autres personnes qui ont répondu a adopté cette approche.Une autre chose que je voudrais souligner est mon utilisation de la citation. Chaque fois que je fais quoi que ce soit avec des scripts shell, je rappelle aux gens de faire très attention à leurs citations. Une énorme source de problèmes dans les scripts shell est le shell qui interprète des choses qu'il n'est pas censé faire. Et les règles de cotation sont loin d'être évidentes. Je crois que ce script shell est exempt de problèmes de citation.
la source
Utiliser
for thisfile in *.*.*
(c'est-à-dire boucler sur des fichiers avec deux points ou plus dans leur nom). N'oubliez pas de citer vos variables et utilisez--
pour marquer la fin des options comme dansmv -- "$thisfile" "$newname.$extension"
Avec zsh.
la source
Que dis-tu de ça:
AVERTISSEMENT: essayez-le d'abord sur un répertoire factice, je ne l'ai pas testé!
la source
/
.Il semble que de bonnes réponses soient déjà disponibles, mais voici une autre utilisation
tr
etsed
:la source
sed
décide-t-on auquel.*
appliquer le munch maximal? Je me sens beaucoup mieux à ce sujet si le second.*
était[^_]*
.\t
caractères.echo -n "$file"
travaillerait. :-) Oh, et c'est"
autour de l'$( ... )
expression (aka"$( ... )"
) le ferait.Cette version vous permet de sélectionner explicitement le nombre de points que vous souhaitez conserver, en commençant par le côté droit.
En outre, il remplacera et / ou supprimera d'autres caractères en plus des points, et le caractère de remplacement est
-
au lieu d'un trait de soulignement, mais cela peut être facilement modifié.la source