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 04/09/2024, à 16:12

xunil2003

Script bash avec nom de fichier long avec espaces et parentheses sed

Bonjour

J'ai un nom de fichier long avec espaces et parentheses et je doit faire une script qui accède au fichier.

Lorsque je souhaite modifier le nom du fichier avec sed dans un script bash ça ne fonctionne pas.

Le code

# Tableau qui indique le dernier fichier le plus récent copié dans le dossier
declare -a tab

eval "files=($(ls --quoting-style=shell-always -rt $DOSSIER_TELECHARGEMENTS_TERMINE))"
for f in "${files[@]}"; do
  printf '%s\n' "$f"
  RT=`printf '%s\n' "$f"`
  tab[${#tab[*]}]=${RT}
done

# Récupere le nom du fichier dans le tableau
NOM_DERNIER_FICHIER=${tab[-1]}
echo "NOM_DERNIER_FICHIER : $NOM_DERNIER_FICHIER"

# Traitement du fichier
RT=`printf '%s\n' "$NOM_DERNIER_FICHIER"`
NOM_DERNIER_FICHIER2=$(echo $NOM_DERNIER_FICHIER | sed s/' '/'\\ '/g)
NOM_DERNIER_FICHIER3=$(echo $NOM_DERNIER_FICHIER2 | sed s/'('/'\\('/g)
NOM_DERNIER_FICHIER4=$(echo $NOM_DERNIER_FICHIER3 | sed s/')'/'\\)'/g)
NOM_DERNIER_FICHIER5=$(echo $NOM_DERNIER_FICHIER4 | sed s/'nom\'/'\mon '/g)
echo "NOM_DERNIER_FICHIER2 : $NOM_DERNIER_FICHIER2"
echo "NOM_DERNIER_FICHIER3 : $NOM_DERNIER_FICHIER3"
echo "NOM_DERNIER_FICHIER4 : $NOM_DERNIER_FICHIER4"
echo "NOM_DERNIER_FICHIER5 : $NOM_DERNIER_FICHIER5"

echo
echo "Liste le fichier"
echo "ls -alh $DOSSIER_TELECHARGEMENTS_TERMINE/$NOM_DERNIER_FICHIER4"
ls -alh $DOSSIER_TELECHARGEMENTS_TERMINE/$NOM_DERNIER_FICHIER4

et je ne comprends pas il m'affiche ce message d'erreur :

Retour :

Xunil2003 a écrit :

NOM_DERNIER_FICHIER : mon fichier a des (parentheses).mkv

sed: -e expression n°1, caractère 14: commande « s » inachevée
NOM_DERNIER_FICHIER2 : mon\ fichier\ a\ des\ (parentheses).mkv
NOM_DERNIER_FICHIER3 : mon\ fichier\ a\ des\ \(parentheses).mkv
NOM_DERNIER_FICHIER4 : mon\ fichier\ a\ des\ \(parentheses\).mkv
NOM_DERNIER_FICHIER5 :

ls -alh /home/laurent/Test/mon\ fichier\ a\ des\ \(parentheses\).mkv
ls: impossible d'accéder à '/home/laurent/Test/mon\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'fichier\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'a\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'des\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à '\(parentheses\).mkv': Aucun fichier ou dossier de ce type

L'erreur vient de cette ligne

Xunil2003 a écrit :

NOM_DERNIER_FICHIER5=$(echo $NOM_DERNIER_FICHIER4 | sed s/'nom\'/'\mon '/g)

Pourquoi le "ls -alh $DOSSIER_TELECHARGEMENTS_TERMINE/$NOM_DERNIER_FICHIER4" me fonctionne pas et  me retourne

Xunil2003 a écrit :

ls -alh /home/laurent/Test/mon\ fichier\ a\ des\ \(parentheses\).mkv
ls: impossible d'accéder à '/home/laurent/Test/mon\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'fichier\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'a\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'des\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à '\(parentheses\).mkv': Aucun fichier ou dossier de ce type

J'ai besoin d'avoir le retour de la variable "NOM_DERNIER_FICHIER4" avec sed qui fonctionne pour renommer le fichier et le déplacer.

Merci d'avance pour votre avis et conseils.

Dernière modification par xunil2003 (Le 04/09/2024, à 16:52)


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#2 Le 04/09/2024, à 16:38

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

salut,

voilà pourquoi on n'utilise pas ls dans un script !

pour trouver le dernier fichier modifié directement sous un répertoire :

lastFic=$(find "$repertoire" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -zn -k1,1 | cut -z -d ' ' -f 2 | tail -z -n1 | xargs -0 echo)

pour rappel : sed est un traitement de texte, c'est un petit peu sur-dimensionné pour traiter les quelques caractères d'un nom de fichier. wink

edit: il faut toujours mettre les Développements de paramètres (cf. cette expression dans le man) entre guillemets !

Dernière modification par Watael (Le 04/09/2024, à 16:40)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 04/09/2024, à 16:47

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,

Justement ça marche pas a causes du nom de fichier long causé par les espaces et les parentheses.

Xunil2003 a écrit :

aurent@vincent-I7-9700K:~$ $(find "$HOME/Test" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -zn -k1,1 | cut -z -d ' ' -f 2 | tail -z -n1 | xargs -0 echo)
bash: /home/laurent/Test/mon: Aucun fichier ou dossier de ce type
laurent@vincent-I7-9700K:~$

voila pourquoi j'ai fait un script différent.

Merci.


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#4 Le 04/09/2024, à 18:34

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

tu t'y prends mal : là, tu laisses la Substitution de commande, qui va essayé d'exécuter le fichier. C'est vraiment ce que tu veux ?
ensuite, comme je l'ai dit, il faut mettre des guillemets !

~ $ ls -rtl mon*
lrwxrwxrwx 1 watael watael 14  5 févr.  2018  monFaitChier -> 'mon'$'\n''fait'$'\n''chier'
-rw-r--r-- 1 watael watael  0 15 août   2021 'monF'$'\n''ait'$'\t''Chier'
-rw-r--r-- 1 watael watael 45 22 févr.  2023  monTest.tar.gz
-rw-r--r-- 1 watael watael  0  4 sept. 18:36 'mon'$'\n''fait'$'\n''chier'
~ $ lastFic=$(find . -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2 | tail -z -n1 | xargs -0 echo)
~ $ echo "$lastFic" 
./mon
fait
chier
~ $ "$lastFic"
bash: ./mon
fait
chier: Permission non accordée
~ $ 

Dernière modification par Watael (Le 04/09/2024, à 18:38)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 04/09/2024, à 20:07

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,

Voici le script comme je l'ai ecrit ainsi que le retour.
Mais je ne comprends pas comment dans le script y faire fonctionner.
Oui j'ai besoin d'exécuter le fichier pour le renommer et le déplacer via le script, il faut donc que je puis récupérer le nom de fichier dans une variable avec les slash mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv'
Merci.

Script bash

echo
echo "ls -rtl $DOSSIER_TELECHARGEMENTS_TERMINE/mon*"
ls -rtl $DOSSIER_TELECHARGEMENTS_TERMINE/mon*
echo
echo "lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2 | tail -z -n1 | xargs -0 echo)"
lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2 | tail -z -n1 | xargs -0 echo)
echo
echo "$lastFic" 
$lastFic
echo
echo "ls -rtl $lastFic*"
ls -rtl $lastFic*

Retour :

Xunil2003 a écrit :

ls -rtl /home/laurent/Test/mon*
-rw-rw-r-- 1 laurent laurent 0 sept.  4 17:51 '/home/laurent/Test/mon fichier a des (parentheses).mkv'
-rw-rw-r-- 1 laurent laurent 0 sept.  4 17:52 '/home/laurent/Test/mon fichier a des espaces et (parentheses).mkv'
-rw-rw-r-- 1 laurent laurent 0 sept.  4 19:55 '/home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv'

lastFic=/home/laurent/Test/mon

/home/laurent/Test/mon
/home/laurent/Langages/bash/RPI4/Test-2.sh: ligne 141: /home/laurent/Test/mon: Aucun fichier ou dossier de ce type

ls -rtl /home/laurent/Test/mon*
-rw-rw-r-- 1 laurent laurent 0 sept.  4 17:51 '/home/laurent/Test/mon fichier a des (parentheses).mkv'
-rw-rw-r-- 1 laurent laurent 0 sept.  4 17:52 '/home/laurent/Test/mon fichier a des espaces et (parentheses).mkv'
-rw-rw-r-- 1 laurent laurent 0 sept.  4 19:55 '/home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv'
laurent@vincent-I7-9700K:~$


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#6 Le 04/09/2024, à 23:21

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

oops ! oubli : il faut ajouter un tiret après le 2 du cut :

lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)

on coupe tout le reste à partir du deuxième "mot".

NB: n'oublie de toujours mettre des guillemets autour des Développements de paramètres. TOUJOURS !!!*

--
* à moins de savoir pourquoi. wink


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 05/09/2024, à 00:16

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,

ça marche pas même avec le un tiret après le 2 du cut

code :

echo "lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)"
lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
echo
echo "$lastFic" 
$lastFic

Retour :

Xunil2003 a écrit :

/home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv
/home/laurent/Langages/bash/RPI4/Test-2.sh: ligne 141: /home/laurent/Test/mon: Aucun fichier ou dossier de ce type

Merci.

Dernière modification par xunil2003 (Le 05/09/2024, à 00:16)


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#8 Le 05/09/2024, à 00:22

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

NB: n'oublie de toujours mettre des guillemets autour des Développements de paramètres. TOUJOURS !!!*

--
* à moins de savoir pourquoi. wink

or, il n'y a toujours pas de guillemets à la ligne 141.

mais pourquoi, d'ailleurs, insistes-tu à vouloir exécuter un fichier .mkv ? c'est un fichier multimédia; c'est comme si tu demandais à exécuter un fichier .jpeg !

et, puisqu'il est question d'un répertoire de téléversement, as-tu considéré la solution proposée par erresse, ici

Dernière modification par Watael (Le 05/09/2024, à 00:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 05/09/2024, à 00:46

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re

Vous dites "mettre des guillemets autour des Développements de paramètres"
Mais ou dans le code et comment, pouvez vous me montrer.

Xunil2003 a écrit :

lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)

Merci.


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#10 Le 05/09/2024, à 01:04

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

ce que tu montres n'est pas un Développement de paramètres, c'est une Substitution de commande

echo "lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)"
lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
echo
echo "$lastFic" # Comme ici
$lastFic        # c'est là qu'il faut ajouter des guillemets

la question reste ouverte : pourquoi vouloir exécuter un fichier .mkv ? ce type de fichier a besoin d'une application pour les lire. Ici, vlc, par exemple.

Dernière modification par Watael (Le 05/09/2024, à 01:05)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#11 Le 05/09/2024, à 09:50

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,

Le fichier doit être déplacer et renommer par le script et pour cela il me faut le nom de fichier dans une variable avec les slashs

mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv'

Pour en revenir à Développement de paramètres, vous dites "mettre des guillemets autour des Développements de paramètres" la je ne pige pas puisque c'est une Substitution de commande

Script bash :

echo "lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)"
lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
echo
echo "$lastFic"  <----- Il y a les guillemets, mais ça fonctionne pas
$lastFic  <----- Ligne 141 

retour :

Xunil2003 a écrit :

lastFic=/home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv

/home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv
/home/laurent/Langages/bash/RPI4/Test-2.sh: ligne 141: /home/laurent/Test/mon: Aucun fichier ou dossier de ce type

Le code est il correct dans le script ?
dans le retour le nom de fichier n'a pas les slashs

mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv'

Pour déplacer

mv /home/user/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv /home/user/dossier/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv'

pour renomer

cd /chemin/au/dossier 
mv mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv mon-fichier-a-plus-des-espaces-et-des-parentheses-a-la-con.mkv'

Merci


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#12 Le 05/09/2024, à 11:17

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

tu n'as pas besoin de slash quand tu mets des guillemets (c'est quand même plus simple).

lastFic=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
lastFic=${lastFic//[)(]} # parce que, dans une assignation, le shell protège les caractères spéciaux
lastFic=${lastFic// /-}  # je sais pourquoi je ne mets pas de guillemets. :D
echo "$lastFic"

Dernière modification par Watael (Le 05/09/2024, à 11:23)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 05/09/2024, à 15:51

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,
j'ai fait ceci

Script bash

lastFic1=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
lastFic2=${lastFic1//[)(]} # parce que, dans une assignation, le shell protège les caractères spéciaux
lastFic3=${lastFic2// /-}  # je sais pourquoi je ne mets pas de guillemets. :D
lastFic4=${lastFic1// /'\ '}  # je sais pourquoi je ne mets pas de guillemets. :D
lastFic5=${lastFic4// (/' \('}  # je sais pourquoi je ne mets pas de guillemets. :D
lastFic6=${lastFic5//)/'\)'}  # je sais pourquoi je ne mets pas de guillemets. :D

echo "lastFic1 : $lastFic1"
echo "lastFic2 : $lastFic2"
echo "lastFic3 : $lastFic3"
echo "lastFic4 : $lastFic4"
echo "lastFic5 : $lastFic5"
echo "lastFic6 : $lastFic6"
echo
echo "ls -alh $lastFic6"
ls -alh $lastFic6
echo
echo "mv -v $lastFic6 $lastFic3"
mv -v $lastFic6 $lastFic3

retour

Xunil2003 a écrit :

lastFic1 : /home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv
lastFic2 : /home/laurent/Test/mon fichier a des espaces et des parentheses.mkv
lastFic3 : /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv
lastFic4 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ (parentheses).mkv
lastFic5 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses).mkv
lastFic6 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv

ls -alh /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv
ls: impossible d'accéder à '/home/laurent/Test/mon\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'fichier\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'a\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'des\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'espaces\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'et\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à 'des\': Aucun fichier ou dossier de ce type
ls: impossible d'accéder à '\(parentheses\).mkv': Aucun fichier ou dossier de ce type

mv -v /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv
mv: la cible '/home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv' n'est pas un répertoire

Pourquoi la commande ls ne fonctionne pas dans le script bash alors que directement dans le dans le shell ça marche, j'ai besoin de savoir la taille du fichier.
Effectivement le script doit m'envoyer un mail avec le nom d'origine du fichier, le déplacer dans un autre dossier, renommer le nom fichier, indiquer dans l'email le nouveau nom du fichier son emplacement et la taille du fichier. je récupére les informations dans des variables depuis des fonctions exécuté dans le script avant d'envoyer l'email.

xunil2003 a écrit :

laurent@vincent-I7-9700K:~$ ls -alh /home/laurent/Test/mon\ fichier\ a\ des\ \(parentheses\).mkv
-rw-rw-r-- 1 laurent laurent 0 sept.  4 17:51 '/home/laurent/Test/mon fichier a des (parentheses).mkv'
laurent@vincent-I7-9700K:~$

J'ai également le même problème pour renommer le nom du fichier
D'ou viens le problème ?


Merci.

Dernière modification par xunil2003 (Le 05/09/2024, à 16:42)


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#14 Le 05/09/2024, à 16:51

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

les slash que tu ajoutes dans le Développement de paramètres (je t'ai d'ailleurs dit qu'ils sont inutiles) n'ont plus de valeur de "méta-caractère" qui protégerait les autres caractères spéciaux, ils deviennent partie intégrante de la chaîne.

mv -v $lastFic6 $lastFic3 # et là ?! tu sais pourquoi tu ne mets pas de guillemets ?

D'où vient le problème ?

de toi. tongue lol
tu copies sans comprendre ce que je propose, et tu rajoutes des trucs dont je t'ai dit qu'ils sont inutiles quand on utilise correctement (c'est à dire, TOUJOURS!!!) les guillemets.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 05/09/2024, à 20:05

xunil2003

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

Re,

Oui j'ai oublier les guillemets..
Si vous ne m'expliquer pas d'ou vient le problème ont vas y passer la noêl.
Je ne comprends pas pourquoi les commande ls et mv ne fonctionne pas, pourtant tout fichier long avec espaces doit avoir des slashs

scrit bash :

lastFic1=$(find "$DOSSIER_TELECHARGEMENTS_TERMINE" -maxdepth 1 -type f ! -name '.*' -printf '%T@ %p\0' | sort -nz -k1,1 | cut -z -d ' ' -f 2- | tail -z -n1 | xargs -0 echo)
lastFic2=${lastFic1//[)(]} # parce que, dans une assignation, le shell protège les caractères spéciaux
lastFic3=${lastFic2// /-} 
lastFic4=${lastFic1// /'\ '} 
lastFic5=${lastFic4// (/' \('} 
lastFic6=${lastFic5//)/'\)'}  

echo "lastFic1 : $lastFic1"
echo "lastFic2 : $lastFic2"
echo "lastFic3 : $lastFic3"
echo "lastFic4 : $lastFic4"
echo "lastFic5 : $lastFic5"
echo "lastFic6 : $lastFic6"
echo
echo "ls -alh $lastFic6"
ls -alh "$lastFic6"
echo
echo "mv -v $lastFic6 $lastFic3"
mv -v "$lastFic6 $lastFic3"

retour :

Xunil2003 a écrit :

lastFic1 : /home/laurent/Test/mon fichier a des espaces et des (parentheses).mkv
lastFic2 : /home/laurent/Test/mon fichier a des espaces et des parentheses.mkv
lastFic3 : /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv
lastFic4 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ (parentheses).mkv
lastFic5 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses).mkv
lastFic6 : /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv

ls -alh /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv
ls: impossible d'accéder à '/home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv': Aucun fichier ou dossier de ce type

mv /home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv
mv: opérande de fichier cible manquant après '/home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv'
Saisissez « mv --help » pour plus d'informations.

Merci.


- AMD R9 5950x 64 Go Ram / Intel Pentium I7 960 - 12 Go Ram - 6 T0 - Kubuntu 12.04 x64 / Kubuntu 14.04 x64 / Kubuntu 16.04 x64 / Kubuntu 18.04 x64 /  Kubuntu 20.04 x64 / Mint
- DreamPlug Multi Boot / Marvel 1.22 Ghz / Architecture ARM / 512 Mo Ram / Carte-sd 16 Go class 10 / 5 Watts / Debian Squeeze 2.6.39.4
- Raspberry PI 1 / Raspberry PI 2 / Raspberry PI 3 / Raspberry PI 4 : 4Gb
JE SUIS CHARLIE

Hors ligne

#16 Le 05/09/2024, à 20:15

Watael

Re : Script bash avec nom de fichier long avec espaces et parentheses sed

xunil2003 a écrit :

Si vous ne m'expliquer pas d'ou vient le problème ont vas y passer la noêl.

watael a écrit :

tu rajoutes des trucs dont je t'ai dit qu'ils sont inutiles quand on utilise correctement (c'est à dire, TOUJOURS!!!) les guillemets.

watael a écrit :

les slash que tu ajoutes dans le Développement de paramètres (je t'ai d'ailleurs dit qu'ils sont inutiles) n'ont plus de valeur de "méta-caractère" qui protégerait les autres caractères spéciaux, ils deviennent partie intégrante de la chaîne.

qu'est-ce qui n'est pas clair ?

et puis, apprends à lire les messages d'erreur !

mv: opérande de fichier cible manquant après '/home/laurent/Test/mon\ fichier\ a\ des\ espaces\ et\ des\ \(parentheses\).mkv /home/laurent/Test/mon-fichier-a-des-espaces-et-des-parentheses.mkv'

il faut mettre des guillemets autour de chaque Développement de paramètre !

$ v1=a
$ v2=b
$ printf '%q\n' "$v1 $v2"
a\ b
$ printf '%q\n' "$v1" "$v2"
a
b
$

Dernière modification par Watael (Le 05/09/2024, à 20:19)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne