2010-08-30 7 views
0

j'ai écrit un petit script shell basé sur un exemple que je trouve ici: https://bbs.archlinux.org/viewtopic.php?id=36305Shell script pour renommer les fichiers

prend ceci:

bash-3.2$ ls 
test 001 test 002 test 003 test 004 

et il se transforme en:

bash-3.2$ ls 
001 002 003 004 rename.sh 

Cependant, il me donne cette erreur (même si cela fonctionne):

bash-3.2$ ./rename.sh 
mv: missing destination file operand after `rename.sh' 
Try `mv --help' for more information. 
`test 001' -> `001' 
`test 002' -> `002' 
`test 003' -> `003' 
`test 004' -> `004' 

Bien que cela fonctionne correctement, il serait bon de voir où j'ai foiré, j'ai supposé par défaut qu'il mettrait les fichiers dans le même répertoire (c'est la sortie désirée).

#!/bin/bash 
ls | while read -r FILE 
do 
     mv -v "$FILE" `echo $FILE | awk -F ' ' '{print $2}'` 
done 

Merci d'avance de m'avoir aidé à corriger mon code incorrect.

Répondre

0

Postman l'a presque. Pour rename.sh, la commande retourne awk rien si en effet vous avez la commande suivante les tentatives de shell pour exécuter:

mv rename.sh 

d'où le message d'erreur « fichier de destination manquant »

vous pouvez résoudre ce problème en test pour le nom de fichier du script, codé en dur ou $ 0, et en exécutant la commande mv uniquement si $ FILE est égal au nom du script.

+0

et une solution consiste à ne faire que les fichiers qui incluent un espace: 'ls * '' * | '... – ysth

+0

Merci cela fait tellement de sens maintenant! – eddylol

+0

Désolé je suis allé sur une tangente, donc supprimé ma réponse :) – PostMan

1

pourquoi utilisez-vous ls avec un processus supplémentaire à while loop? Utilisez simplement une boucle for avec expansion de shell. C'est la manière préférée

#!/bin/bash 
shopt -s nullglob 
for file in * 
do 
    if [ -f "$file" ];then 
    newfile="${file##* }" 
    mv "$file" $newfile" 
    fi 
done 
Questions connexes