Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/04/2015, à 11:12

Link_Octree

[Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

Hello,

Je dispose d'un dossier contenant plusieurs fichiers .csv nommés sous la forme Blablabla - Blablabla - 3101.csv.

Je souhaiterais renommer ces fichiers en ne conservant que les quatre derniers charactères précédent l'extension.
Même si c'est pas l'idéal, j'aimerais beaucoup faire celà via cut, que je connais un petit peu, et que je pourrais ainsi adapter dans d'autres scripts futurs.

J'aimerais ensuite inverser les deux premiers et les deux dernières charactères pour obtenir la date sous la forme US (mois/jour) du genre 0131.csv

Le bout de code auquel j'ai pensé et qui ne fonctionne pas est le suivant:

for file in /home/user/dossier
do
mv $file $file | cut -d"." -f1 | tail -c5 
done

Merci beaucoup smile

Hors ligne

#2 Le 06/04/2015, à 11:42

pingouinux

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

Bonjour,
Tu peux essayer ceci

for file in /home/user/dossier/*.csv
do
   bsn=$(basename "$file" .csv | tail -c5)
   drn=$(dirname "$file")
   nom=${bsn:2:2}${bsn:0:2}.csv
   echo mv -i "$file" "$drn/$nom"
done

et enlever le echo si c'est bon.

Hors ligne

#3 Le 06/04/2015, à 12:20

Link_Octree

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

Merci du tuyau mais çà ne fonctionne pas: le script ne semble pas s'appliquer correctement au 4 derniers charactères du nom du fichier:

+ for file in '/home/user/dossier/*.csv'
++ basename PMT .csv
++ tail -c5
+ bsn=PMT
++ dirname PMT
+ drn=.
+ nom=TPM.csv
+ mv -i PMT ./TPM.csv
mv: impossible d'évaluer « PMT »: Aucun fichier ou dossier de ce type

Hors ligne

#4 Le 06/04/2015, à 12:42

pingouinux

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

Es-tu sûr que les noms de fichiers aient le format que tu indiques en #1 : Blablabla - Blablabla - 3101.csv
Que retourne

ls -l /home/user/dossier/*.csv

Hors ligne

#5 Le 06/04/2015, à 17:59

tiramiseb

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

Salut,

Juste pour rebondir sur ta toute première idée, la bonne syntaxe aurait été :

for file in /home/user/dossier/*.csv
do
mv "$file" "$(echo "$file" | cut -d"." -f1 | tail -c5)"
done

Après, ce que propose pingouinux est bien sûr très bien, c'est juste une manière différente.

----------------

Ensuite, concernant l'erreur rencontrée, la chose suivante me chiffonne beaucoup :

la boucle "for" semble bien se faire sur les fichiers "*.csv", mais l'exécution de la commande "basename" semble se faire sur un fichier qui s'appelle juste "PMT", donc ne correspondant pas à "*.csv". Ça ne vous chiffonne pas, vous ? pingouinux ?

Hors ligne

#6 Le 06/04/2015, à 19:34

pingouinux

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

@tiramiseb :

As-tu vu que Link_Octree veut aussi modifier le format de la date (inversion du jour et du mois) ? Et il faut aussi rajouter le suffixe.

tiramiseb a écrit :

la boucle "for" semble bien se faire sur les fichiers "*.csv", mais l'exécution de la commande "basename" semble se faire sur un fichier qui s'appelle juste "PMT", donc ne correspondant pas à "*.csv".

Je suis d'accord avec toi que quelque chose n'est pas cohérent, et je voulais justement voir la liste des fichiers. Il faudrait voir aussi le script tel qu'il a été lancé.

Hors ligne

#7 Le 06/04/2015, à 19:37

tiramiseb

Re : [Bash] Renommer plusieurs fichiers en conservant qu'une partie du nom

As-tu vu que Link_Octree veut aussi modifier le format de la date

Au temps pour moi. En effet je n'avais pas vu ça. Mon message avait pour seul but de lui montrer ce qui aurait été une syntaxe correcte pour sa première approche, je n'aurais pas dû dire que ça fait ce qu'il veut et ce n'est pas équivalent à ce que tu proposes. Je me suis avancé un peu trop vite, en lisant mal.

(bon allez, à ma décharge, je suis malade, je souffre horriblement de la gorge, arrggghh je meurs, je vais mourir, arrggghhh infirmièèèère viiiiiiite, des gratouilles big_smile )

Il faudrait voir aussi le script tel qu'il a été lancé.

Oui, c'est impératif.

Hors ligne