Résolu le 13-03-19 Traiter des fichiers dans des sous-dossiers

Questions concernant les lignes de commandes
Avatar du membre
Nerva
Messages : 376
Enregistré le : lun. 4 mars 2019 18:48

Traiter des fichiers dans des sous-dossiers

Message par Nerva »

Salut.

N'étant pas du tout familier du terminal, je bute sur un truc qui va certainement vous paraître rudimentaire, mais tant pis, je n'ai pas trouvé de réponse sur le Net. :mrgreen:

J'utilise Flac (conversion audio) et Python-rgain (calcul du replay-gain) en ligne de commande. J'ai un dossier Audio/Conversion où je place mes fichiers WAV à convertir. La commande :
flac -7 --replay-gain *.wav
-7 étant le taux de compression

1) Comment faire pour qu'une fois la console lancée je puisse exécuter la commande directement sans me rendre préalablement dans Audio/Conversion ? J'ai essayé naïvement ça :
flac -7 --replay-gain Audio/Conversion *.wav
Mais c'est pas bon. :D

2) A supposer que je dispose d'un dossier global qui contient tous les WAV, par exemple, Audio/Albums/Nom_de_l'artiste/Nom_de_l'album, comment faire pour traiter tous les fichiers d'un seul coup ?

3) Tant que j'y suis, comment créer un lanceur qui exécute une commande précise de terminal ?

Je vous remercie.
Linux Mint 21.3 Virginia | Cinnamon 6.0.4

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

Il faut que tu cherches avec le mot clef recursif

Je présume que c'est un truc de ce style que tu cherches

Code : Tout sélectionner

recursiveSearch() {
    [ -r "$1" ] && [ -x "$1" ] || return 1 # Si on peut fouiller dans le dossier
    [ "`ls "$1" | wc -l`" == "0" ] && return 0 # Si le dossier est vide
    for file in "$1"/*; do
        if [ -d "$file" ]; then
            recursiveSearch "$file"
        fi
        echo "$file"
    done
}
Puis exemple de conversion mp3/wav mais non récursive

Code : Tout sélectionner

for i in *.wav; do lame -b 320 -h "${i}" "${i%.wav}.mp3"; done
Pour le lancer, rendre le script executable
Puis man ln
Ou installer menulibre pour l'ajouter facilement au menu
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
Nerva
Messages : 376
Enregistré le : lun. 4 mars 2019 18:48

Re: Traiter des fichiers dans des sous-dossiers

Message par Nerva »

A part la seconde ligne qui deviendrait (pour WAV -> FLAC) :

Code : Tout sélectionner

for i in *.wav; do flac -7 "${i}" "${i%.wav}.flac"; done
Je n'ai pas compris grand-chose ! :oops: Récursif ? Non récursif ? Faut créer des fichiers batch ?
Linux Mint 21.3 Virginia | Cinnamon 6.0.4

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

Les fichiers batch n'existent pas sous linux, tu confonds avec bash


Créer un fichier test.sh

Code : Tout sélectionner

#!/bin/sh

dossierDeTravail="/home/tonUser/tonDossier";

recursiveSearch() {
    [ -r "$1" ] && [ -x "$1" ] || return 1 # Si on peut fouiller dans le dossier
    [ "`ls "$1" | wc -l`" == "0" ] && return 0 # Si le dossier est vide
    for file in "$1"/*; do
        if [ -d "$file" ]; then
            recursiveSearch "$file"
        fi
        echo "$file"
    done
}

recursiveSearch  $dossierDeTravail
tu le lances

Code : Tout sélectionner

sh test.sh
Tu auras en sortie tous les fichiers contenus dans ce dossier
Tu personnalises le truc au niveau de la ligne echo "$file" où tu mets tes commandes de traitement
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

recursif : parcours les dossiers depuis le dossier parent vers les dossiers enfants (dirons nous)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

Sans doute moyen de sortir un script meilleur, mais là je suis au taf...
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

1) Comment faire pour qu'une fois la console lancée je puisse exécuter la commande directement sans me rendre préalablement dans Audio/Conversion ? J'ai essayé naïvement ça :
Utilise un chemin absolu

Code : Tout sélectionner

/home/$USER/Audio/Conversion
A adpater à ton système et arborescence de fichiers : dossiers
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
Nerva
Messages : 376
Enregistré le : lun. 4 mars 2019 18:48

Re: Traiter des fichiers dans des sous-dossiers

Message par Nerva »

Alors :

Code : Tout sélectionner

#!/bin/sh

dossierDeTravail="/home/nerva/Audio/Conversion";

recursiveSearch() {
    [ -r "$1" ] && [ -x "$1" ] || return 1 # Si on peut fouiller dans le dossier
    [ "`ls "$1" | wc -l`" == "0" ] && return 0 # Si le dossier est vide
    for file in "$1"/*; do
        if [ -d "$file" ]; then
            recursiveSearch "$file"
        fi
        echo "$file" for i in *.wav; do flac -7 "${i}" "${i%.wav}.flac"; done
    done
}

recursiveSearch  $dossierDeTravail
Ce fichier test.sh, je l'enregistre où ?
Linux Mint 21.3 Virginia | Cinnamon 6.0.4

Avatar du membre
cyrille
Administrateur du site
Messages : 12394
Enregistré le : mar. 19 sept. 2017 08:49
Localisation : Nowhere
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par cyrille »

Non;

Code : Tout sélectionner

echo "$file" for i in *.wav; do flac -7 "${i}" "${i%.wav}.flac"; done
Il va reboucler dans un boucle...

°Passe directement ta commande

Le script tu l'enregistre où tu veux... Dans un répetoire /home/$USER/scripts/ par exemple

Avant de lancer ton script, fais un backup de ton repertoire, tu pourrais avoir des surprises ;)
?séuqartéd sel ruoP / sécnoféd sel ruoP / sreiruréB sel ruoP / ?étéicos elleuQ

https://crust.ovh

Avatar du membre
arghlub
Administrateur du site
Messages : 10421
Enregistré le : dim. 21 mai 2017 08:19
Localisation : Provence
Contact :

Re: Traiter des fichiers dans des sous-dossiers

Message par arghlub »

Salut,
Nerva a écrit :
lun. 11 mars 2019 09:56
1) Comment faire pour qu'une fois la console lancée je puisse exécuter la commande directement sans me rendre préalablement dans Audio/Conversion ? J'ai essayé naïvement ça :
flac -7 --replay-gain Audio/Conversion *.wav
Mais c'est pas bon. :D
Tu as fait une erreur en saisissant le chemin vers les fichiers .wav (un / manquant et un espace en trop)
Je suppose que ton répertoire Audio/Conversion est dans ton /home.
Il faut saisir cette commande (en étant dans ton /home) :

Code : Tout sélectionner

flac -7 --replay-gain Audio/Conversion/*.wav
Ou mieux, tu mets le chemin absolu (pas en chemin relatif) pour pouvoir l'exécuter de n'importe où (et donc créer un lanceur facilement) :

Code : Tout sélectionner

flac -7 --replay-gain ~/Audio/Conversion/*.wav
(le tilde ~ est une abréviation pour «/home/TON_USER»)


[EDIT] oups grillé par cyrille ;)
Tour1 (custom)CM MSI Z270 M3 | CPU Intel I7-7700K | CG Nvidia GTX 1080 | RAM 16Go | tripleBoot : Debian 11 | MXlinux 21 | LMint 19.3 | XFCE
Tour2 (custom)CM Gigabyte | CPU AMD Athlon 5200+ | CG Nvidia GTX 560 | RAM 6Go | FreeBSD 12.1 XFCE
Portable1 MSI GF75 Thin 9SC | CPU Intel I7-9750H | CG Nvidia GTX 1650 | RAM 32Go | dualBoot : LMint 20.2 | MXlinux 21 | XFCE
Portable2 MacBook Air A1466 (2015) | CPU Intel I5-5250U | CG Intel HD Graphics 6000 | RAM 8Go | dualBoot : macOS Sierra | MXlinux 21 XFCE
─────( pour une informatique libre ! -membre en stand-by de l' April.org────────────────

Répondre