#1 Le 10/09/2021, à 18:54
- Hizoka
[Résolu] Reconstruire des adresses de fichiers
Bonsoir,
je suis en train de faire des tests avec les servicemenus et il est possible d’exécuter une commande avec une liste de fichier.
C'est censé envoyé les fichiers comme des arguments séparés mais ce n'est pas le cas, tout est mis à la suite.
Je voudrais essayer de reconstruire les adresses pour les traiter les unes après les autres.
Si je demande au servicemenu de me renvoyer la commande fichier après fichier, je me retrouve à tout traiter simultanément et ce n'est pas possible vu la charge disque.
Il serait possible de passer via un fichier qui indique ce qu'il y a à faire, je serais peut être obligé d'en finir par ça mais pas fan...
Voici ce que j'ai fait, dites moi ce que vous en pensez svp, merci.
ServiceMenu="/home/hizoka/Fichier 01 /home/hizoka/Fichier 02 /home/hizoka/Fichier 03"
mapfile -td ' ' FichiersTemp < <(echo -n "${ServiceMenu}")
for x in "${FichiersTemp[@]}"
do
Fichier+=" ${x}"
if [[ -f "${Fichier/# }" ]]
then
Fichiers+=("${Fichier/# }")
unset Fichier
fi
done
for x in "${Fichiers[@]}"
do
echo "Fichier : $x"
done
echo "Il reste $Fichier"
Mais ça ne me parait pas super sécure quand même...
Surtout si un fichier se retrouve effacé entra temps (même si très peu probable)...
Le séparateur est un espace...
Il n'est pas possible de rechercher espace suivi de / car on pourrait avoir une faute du style dossier /fichier....
De même on ne peut se baser sur la recherche d'extension car les fichiers peuvent ne pas en avoir et on pourrait en trouver dans des noms de dossier...
Merci
Dernière modification par Hizoka (Le 12/09/2021, à 19:16)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 10/09/2021, à 20:13
- kamaris
Re : [Résolu] Reconstruire des adresses de fichiers
Tu n'as vraiment pas moyen d'avoir autre chose en entrée ?
Hors ligne
#3 Le 10/09/2021, à 22:17
- Hizoka
Re : [Résolu] Reconstruire des adresses de fichiers
Malheureusement, contrairement à ce qui est indiqué dans les spécifications, tout est en une seule valeur.
%F : A list of files. Use for apps that can open several local files at once. Each file is passed as a separate argument to the executable program.
...
%U : A list of URLs. Each URL is passed as a separate argument to the executable program. Local files may either be passed as file: URLs or as file path.
J'ai testé toutes les variables possibles mais aucune ne sépare les fichiers...
Je vois que d'autres personnes font ainsi en perl :
$ARGV[0] =~ s' /' //'g;
my @fileNames = split(' /', $ARGV[0]);
Mais je ne trouve pas ça très fonctionnel pour le coup... il suffit d'un espace qui se ballade en fin de nom pour que ça fonctionne plus...
Je pense avoir amélioré le truc :
function popo
{
local x old FichiersTemp Fichiers
# Protection d'un dossier qui ne contiendrait qu'un espace
Temp="${1//\/ \//@@@@@Hizo@@@@@}"
mapfile -td '|' FichiersTemp < <(echo -n "${Temp// \//|/}")
# Suppression du dernier espace ajouté par find uniquement pour l'exemple
(( ${#FichiersTemp[@]} )) && FichiersTemp[-1]="${FichiersTemp[-1]/% }"
for x in "${FichiersTemp[@]}"
do
x="${x//@@@@@Hizo@@@@@// /}"
if [[ -e "$old$x" ]]
then
old+="$x"
(( ${#Fichiers[@]} )) && unset Fichiers["-1"]
Fichiers+=("${old}")
elif [[ -e "$old$x " ]]
then
old+="$x "
(( ${#Fichiers[@]} )) && unset Fichiers["-1"]
Fichiers+=("${old}")
elif [[ -e "$x" ]]
then
old="$x"
Fichiers+=("${x}")
elif [[ -e "$x " ]]
then
old="$x "
Fichiers+=("${x} ")
fi
done
for Fichier in "${Fichiers[@]}"
do
echo "Fichier : $Fichier"
done
}
mkdir -p "${HOME}"/test/{a/{1\ ,2,3},b/{1,2\ ,3},c\ /{1,2,3}}
popo "$(find ${HOME}/test/ -type d -printf "%p ")"
Fichier : x : _/home/hizoka/test/_
Fichier : x : _/home/hizoka/test/a _
Fichier : old : _/home/hizoka/test/a /3_
Fichier : old : _/home/hizoka/test/a /1 _
Fichier : old : _/home/hizoka/test/a /2_
Fichier : x : _/home/hizoka/test/b_
Fichier : x : _/home/hizoka/test/b/2 _
Fichier : x : _/home/hizoka/test/b/1_
Fichier : x : _/home/hizoka/test/b/3_
Fichier : x : _/home/hizoka/test/c _
Fichier : old : _/home/hizoka/test/c /1_
Fichier : old : _/home/hizoka/test/c /3_
Fichier : old : _/home/hizoka/test/c /2_
EDIT : Modifications :
- les dossiers composés uniquement d'espace sont ok
- /home/hizoka/test /home/hizoka lit bien 1 dossier et non 2
Je privilégie le sous dossier que de repartir à 0 mais ce n'est pas forcément toujours la bonne réponse.
L'autre idée serait de repérer l'emplacement commun des éléments mais en mode arborescence, ont peut sélectionner des dossiers à différents endroits...
Dernière modification par Hizoka (Le 11/09/2021, à 08:26)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 11/09/2021, à 19:44
- kamaris
Re : [Résolu] Reconstruire des adresses de fichiers
Perso j'essaierais vraiment d'avoir une autre entrée, quitte à utiliser %f et %u au lieu de %F et %U, ou par tout autre moyen, j'en sais rien (selon ce qui se passe en amont de la spec freedesktop).
Mais ça c'est vraiment pas terrible, ou alors il faut faire des hypothèses supplémentaires.
Hors ligne
#5 Le 12/09/2021, à 18:31
- Hizoka
Re : [Résolu] Reconstruire des adresses de fichiers
Je viens de tester avec %u et %f avec une fonction du genre :
# Si le fichier existe déjà, on ajoute l'élément et on stoppe là
if [[ -f "/tmp/ServiceMenu" ]]
then
echo -en "\0$1" >> "/tmp/ServiceMenu"
return
fi
# Si le fichier n'existe pas, on le crée
echo -n "$1" > "/tmp/ServiceMenu"
local SizeFile OldSizeFile x FichiersTemp
# On attend que le fichier se remplisse
while true
do
SizeFile="$(du -b "/tmp/ServiceMenu")"
SizeFile="${SizeFile%%[[:space:]]*}"
if [[ ${SizeFile} != ${OldSizeFile} ]]
then
OldSizeFile="${SizeFile}"
sleep 0.5
else
break
fi
done
mapfile -td '' FichiersTemp < "/tmp/ServiceMenu"
for x in "${FichiersTemp[@]}"
do
echo "x : $x" >> ~/retour.log
done
# Suppression du fichier
rm "/tmp/ServiceMenu"
return
Ca fonctionne pas mal en effet.
Je serais bien parti avec une boucle :
tail -n0 -f | while read fichier
Mais je ne sais pas comment lui dire de s'arrêter quand il voit qu'il ne se passe rien pendant 1s.
Mais tout ça c'est bien beau mais... le service menu se limite à 193-194 fichiers, encore une limitation sortie de nulle part !!!
Alors que %U et %F renvoient bien tous les fichiers
EDIT :
Arf, tous les exemples montrent "%U" alors que %U sépare bien les fichiers...
C'est donc résolu...
Désolé pour le temps perdu Karamis.
Dernière modification par Hizoka (Le 12/09/2021, à 19:16)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne