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 10/09/2021, à 19: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, à 20:16)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 10/09/2021, à 21: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, à 23: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.

https://specifications.freedesktop.org/desktop-entry-spec/desktop-entry-spec-latest.html a écrit :

%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, à 09:26)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 11/09/2021, à 20: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, à 19: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 sad


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, à 20:16)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne