Forum Linux.débutant Problème renommage fichiers avec des espaces.

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
29
août
2016

Bonjour,

Je viens ici après mes recherches non fructueuses, j'aimerais renommer des fichiers contenant des espaces.

J'utilise la commande: find /media/quadra/ -type f -name *.[pP][dD][fF]out -exec ./rename.sh \;

J'utilise find car je dois le faire dans toute une arborescence.
Cet commande me donne bien toute la liste des fichiers en .pdfout et lance mon script rename.sh ci dessous :

    for i  in find /media/quadra -type f -name '*\ *.[pP][dD]  [fF]out'
    do
    mv dollar i dollar {i%.[pP][dD][fF]out}.pdf (le signe dollar bug sur le site ? ;o)
    done

Le problème c'est comment dire à ma variable i de prendre tous le nom de mon fichier exemple renommer "mon fichier.pdfout" en "mon fichier.pdf". Car pour le moment il me met des erreurs du type "mon.pdf aucun fichier/dossier de se type" "fichier.pdf aucun fichier/dossier de se type" au lieu de mon fichier.pdf.

j’espère avoir été assez claire, je vous remercie par avance de votre aide.

Bonne journée

  • # boucle de boucle

    Posté par  . Évalué à 5.

    tu lances un find,
    qui lance rename.sh
    qui lance un find
    qui fait un mv ?

    ou bien tu n'as pas copier/coller les bons morceaux ?

    sinon pour ta question de depart, ton probleme c'est l'espace dans le nom du fichier
    mon fichier.pdfout

    plusieurs solutions :
    - tu peux mettre des guillemets autour de la variable pour qu'elle ne soit pas interpretée,
    - tu peux changer l'IFS par autre chose le temps de ton script,

    sinon pourquoi ne pas utiliser les outils existants ?
    voici une ligne qui devrait faire l'affaire, avec le rename de la distrib

    find /media/quadra -type f -iname *.pdfout -exec rename 's/pdfout/pdf/g' {} \;

    • [^] # Re: boucle de boucle

      Posté par  . Évalué à 3.

      Bien vu la commande rename, j'avais oublié que ça existait :-)

      Pour peaufiner, comme rename peut prendre une liste de fichiers à renommer, on peut combiner find avec xargs, ce qui permet de lancer une seule instance de rename au lieu de le lancer pour chaque résultat de find. Comme les fichiers contiennent éventuellement des espaces il faut alors utiliser l'option -print0 (resp. -0) de find (resp. xargs) pour remplacer l'espace par le caractère nul comme séparateur de champs en sortie (resp. en entrée)

      On peut aussi rendre la regex de rename un peu plus précise en évitant de remplacer les pdfout en milieu de noms de fichier avec 's/pdfout$/pdf/'

      Il faut aussi protéger l'utilisation du caractère * dans le -iname (en tout cas, chez moi, ça ne marche pas sinon)

      au final, ça ferait

      find /media/quadra -type f -iname '*.pdfout' -print0 | xargs -0 rename 's/pdfout$/pdf/'
  • # Merci

    Posté par  . Évalué à 1. Dernière modification le 29 août 2016 à 16:56.

    Je vous remercie pour votre aide,

    Vos deux solutions fonctionnent bien, j'avais essayé avec rename déjà mais sans succès et je vois d'ou viens mon erreur.

    Oui effectivement j'invoque deux fois le find dit comme ça c'est idiot oui, je suis qu'un newbie de linux et au final je me retrouve avec une ligne de commande à rallonge que je pense pouvoir raccourcir. Enfaîte je suis chargé d'optimiser 43 Go de pdf (127 000 ~) j'ai trouvé shrinkpdf le script qui permet de modifier la définition d'un pdf et cela me fait gagner quasiment 20 Go sur 43.

    Je me suis crée une ligne de commande qui cherche tous les .pdf les optimises avec le script et les renommes en sortis en .pdfout pour qu'ensuite je supprime les .pdf pour a la fin renommer les pdfout en pdf pour qu'il ne reste qu'eux. Voici ma ligne de commande :

    find /media/quadra/ -type f -name "*.[pP][dD][fF]" -exec ./shrinkpdf.sh '{}' '{}out' \; ; find /media/quadra/ -type f -name *.[pP][dD][fF] -delete; find /media/quadra/ -type f -name *.[pP][dD][fF]out -exec ./rename.sh \;

    qui devient du coup à la fin :

    find /media/quadra -type f -iname *.pdfout -exec rename 's/pdfout/pdf/g' {} \;

    ou

    find /media/quadra -type f -iname '*.pdfout' -print0 | xargs -0 rename 's/pdfout$/pdf/'

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.