#1 Le 04/09/2024, à 15: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 :
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
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
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, à 15: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, à 15: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.
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, à 15:40)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 04/09/2024, à 15: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.
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, à 17: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, à 17:38)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#5 Le 04/09/2024, à 19: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 :
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 typels -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, à 22: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.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 04/09/2024, à 23: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 :
/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 04/09/2024, à 23: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 04/09/2024, à 23: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.
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 04/09/2024, à 23:24)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#9 Le 04/09/2024, à 23: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.
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, à 00: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, à 00:05)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 05/09/2024, à 08: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 :
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, à 10: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, à 10:23)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 05/09/2024, à 14: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
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\).mkvls -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 typemv -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.
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, à 15: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, à 15: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.
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, à 19: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 :
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\).mkvls -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 typemv /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, à 19:15
- Watael
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
Si vous ne m'expliquer pas d'ou vient le problème ont vas y passer la noêl.
tu rajoutes des trucs dont je t'ai dit qu'ils sont inutiles quand on utilise correctement (c'est à dire, TOUJOURS!!!) les guillemets.
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, à 19:19)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#17 Le 17/10/2024, à 17:13
- sputnick
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
Salut, pour récupérer le dernier fichier de façon propre: https://forum.ubuntu-fr.org/viewtopic.p … #p22793740
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#18 Le 21/10/2024, à 18:55
- Tawal
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
Hello,
Sinon une boucle for et stat :
max=0
for f in Répertoire/*
do
n=$(stat -c "%Y" "$f")
old_max="$max"
((max=n>max?n:max))
((old_max<max)) && newest="$f"
done
echo "$newest"
Mais on connaît le débat sur l'exactitude des dates …
PS: Je suis étonné que Watael propose une série de pipes
Edit:
On peut ajouter un test si "$f" est un répertoire.
Dernière modification par Tawal (Le 21/10/2024, à 19:00)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#19 Le 21/10/2024, à 20:59
- Watael
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
moi ?! une sértie de pipes ?!
for f in ./*; do test -n "$newFic" || { newFic=$f; continue;}; test -f "$f" -a "$f" -nt "$newFic" && newFic=$f; done
Dernière modification par Watael (Le 21/10/2024, à 21:03)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#20 Le 22/10/2024, à 09:32
- Tawal
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
Ah oui ! -nt et -ot, je les avais oubliés ceux là
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#21 Le 22/10/2024, à 16:45
- Watael
Re : Script bash avec nom de fichier long avec espaces et parentheses sed
tu as de la chance : j'y pense "tous les jours", mais je ne m'en sers pas.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne