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 27/01/2016, à 01:08

manon123

[Résolu] Extraction automatique d'un fichier.

Bonne nuit,

J'ai un petit service à vous demander.

Je ne connais rien en programmation bash (un minimum quand même mais...).

Dans le temps sous windows, un membre du forum dont je suis un des admin avait créé un petit fichier .exe qui permettait d'extraire de n'importe quelle archive seulement et j'insiste sur seulement le fichier .epub qu'elle contient parmi pleins d'autres fichiers.

Nous avons souvent des quantités énormes de fichiers compressés (sans mot de passe) et on doit extraite les .epub à la main.

L'un de vous pourrait-il me rendre le service de faire ou de me montrer comment faire un script en bash qui permettrait de faire cela ?

Ces archives sont surtout des .rar, mais aussi des.zip et 7zip.

Ce script nous aiderait beaucoup et gagnerions beaucoup de temps.

Merci d'avance.

Dernière modification par manon123 (Le 01/02/2016, à 01:03)


Distro: Manjaro 20.1-2

Hors ligne

#2 Le 27/01/2016, à 02:13

metalux

Re : [Résolu] Extraction automatique d'un fichier.

Bonsoir,
Avec zip:

unzip -j '/home/user/archive.zip' "*.epub" -d /home/user/

remplace bien par les chemins en entiers. La flemme de regarder à cette heure pour les autres cas tongue
Bonne nuit.

Hors ligne

#3 Le 27/01/2016, à 04:11

nany

Re : [Résolu] Extraction automatique d'un fichier.

metalux a écrit :

La flemme de regarder à cette heure pour les autres cas tongue

yikes
T’auras pas de bière pour la peine. tongue

Bon, un premier jet.

epub_extract.sh a écrit :
#!/bin/bash

#/*
# * ----------------------------------------------------------------------------
# * "THE BEER-WARE LICENSE" (Revision 42):
# * <nany.s@free.fr> wrote this file. As long as you retain this notice you
# * can do whatever you want with this stuff. If we meet some day, and you think
# * this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
# * ----------------------------------------------------------------------------
# *
# *
# * ----------------------------------------------------------------------------
# * "LICENCE BEERWARE" (Révision 42):
# * <nany.s@free.fr> a créé ce fichier. Tant que vous conservez cet
# * avertissement, vous pouvez faire ce que vous voulez de ce truc. Si on se
# * rencontre un jour et que vous pensez que ce truc vaut le coup, vous pouvez
# * me payer une bière en retour. nany
# * ----------------------------------------------------------------------------
# */

# Nécessite p7zip.

clean_exit () {
echo "$2"
exit $1
}

choose_dir () {
zenity --title="$1" --file-selection --filename=~ --directory 2>/dev/null
}

idir=$(choose_dir "Dans quel répertoire sont les archives ?")
(( $? )) && clean_exit 1 "Vous n’avez pas indiqué le répertoire d’entrée."

odir=$(choose_dir "Dans quel répertoire extraire les livres ?")
(( $? )) && clean_exit 2 "Vous n’avez pas indiqué le répertoire de sortie."

for file in "$idir"/*.zip "$idir"/*.rar "$idir"/*.7z
do
  case "${file##*.}" in
    "rar") unrar e "$file" "*.epub" "${odir}/" ;;
    "zip") unzip "$file" "*.epub" -d "${odir}/" ;;
    "7z") 7zr e -o"${odir}/" "$file" "*.epub" ;;
    *) ;;
  esac
done

exit 0

EDIT : j’avais pas vu pour les 7zip.

RE-EDIT : j’avais oublié la licence, très important la licence, faut bien gagner sa vie.

NOUVEL EDIT : petite correction suite aux observations de metalux.

Dernière modification par nany (Le 27/01/2016, à 16:30)

Hors ligne

#4 Le 27/01/2016, à 15:47

metalux

Re : [Résolu] Extraction automatique d'un fichier.

Je crois que manon123 a tout ce qu'il faut maintenant smile

@nany
J'ai une ou 2 questions/réflexions concernant ton script:
Si tu pouvais m'expliquer la syntaxe:

zenity blablabla....filename=~

Ça ouvre dans le répertoire courant. Je ne comprends pas la syntaxe filename=~. J'aurais utilisé --filename="$PWD/" pour faire la même chose mais je trouve plus simple ta façon de faire.
Pour

debext=$(( ${#file} - 3 ))
case "${file:$debext}" in

j'ai mis un peu de temps à comprendre, disons que j’utilise jamais la forme ${x:y}). Je préfère cette forme:

case ${file##*.} etc...

en remplaçant bien entendu .7z par 7z
Tu vois, j'ai eu le courage de regarder, suffit juste d'être bien réveillé big_smile

Hors ligne

#5 Le 27/01/2016, à 16:28

nany

Re : [Résolu] Extraction automatique d'un fichier.

metalux a écrit :

Ça ouvre dans le répertoire courant. Je ne comprends pas la syntaxe filename=~. J'aurais utilisé --filename="$PWD/"

Non, ça ouvre dans $HOME et ce quelle que soit la valeur de $PWD. Même si, dans 98%[1] des cas, ces deux variables ont la même valeur.
Tiens d’ailleurs, je n’est jamais testé ça, mais je pense que sans l’option --filename= ça ouvrira dans $PWD. Cette supposition étant à confirmer ou infirmer avec des tests.

metalux a écrit :

Je préfère cette forme:

case ${file##*.} etc...

en remplaçant bien entendu .7z par 7z

Ah oui, bien vu !
Je pense que c’est une histoire d’habitudes (qui ont la vie dure). En effet, j’ai l’habitude de raisonner avec substring alors que remove peut avoir le même effet. De plus, je ne connais pas encore par cœur toute les syntaxes avec {expression}.
Mais du coup je note (en plus, dans ce cas, ça économise un calcul et une variable) et je modifie de ce pas mon message précédent.


Bon, ben, t’as peut-être mérité une gorgée de bière, alors. tongue



[1] valeur totalement pifométrique

Hors ligne

#6 Le 27/01/2016, à 17:04

manon123

Re : [Résolu] Extraction automatique d'un fichier.

Merci à vous deux.

C'est parfait. J'ai essayé de comprendre un peu, mais il y a des expressions qui sont du martien pour moi.

En tous cas, il fonctionne parfaitement. big_smile

Merci encore.


Distro: Manjaro 20.1-2

Hors ligne

#7 Le 27/01/2016, à 17:16

nany

Re : [Résolu] Extraction automatique d'un fichier.

manon123 a écrit :

il y a des expressions qui sont du martien pour moi.

Tu peux toujours poser des questions sur ce que tu ne comprends pas. On essayera d’y répondre en vulgarisant, contrairement à ma réponse à metalux où j’ai utilisé des expressions techniques.
wink

Hors ligne

#8 Le 27/01/2016, à 17:17

metalux

Re : [Résolu] Extraction automatique d'un fichier.

nany a écrit :

Non, ça ouvre dans $HOME

Oui, c'est ce qui me paraissait logique, mais non, ça ouvre bien dans le répertoire courant.
Pour éviter toute confusion, $HOME = ~ = /home/user
or avec la syntaxe filename=~ si je suis dans /home/user/dossier/essai la fenêtre s'ouvre dans /home/user/dossier/essai et non dans /home/user. Voilà pourquoi je ne la comprenais pas, à moins que je n'ai rien compris tout simplement.

nany a écrit :

Même si, dans 98%[1] des cas, ces deux variables ont la même valeur.

Pas tout compris là, $HOME (dossier utilisateur) et $PWD (répertoire courant) sont souvent différents, non?

nany a écrit :

Bon, ben, t’as peut-être mérité une gorgée de bière, alors. tongue

Comme quoi, tout est question de motivation roll
manon123, tu sais ce qu'il te reste à faire si tu nous croises un jour. big_smile

Hors ligne

#9 Le 27/01/2016, à 17:20

Compte anonymisé

Re : [Résolu] Extraction automatique d'un fichier.

sinon en une ligne de commande (nécessite unar)

for a in *.zip *.7z *.rar;do unar "$a" *.epub;done

#10 Le 27/01/2016, à 23:56

metalux

Re : [Résolu] Extraction automatique d'un fichier.

@nany
Pour filename=~ comme ça ne fonctionnais pas, je m'étais perdu sur un obscur signe =~ alors qu'il s'agissait simplement du tilde équivalent à $HOME roll. le tilde n'est pas reconnu avec ma version de zenity (3.4.0), il faut passer par $HOME. filename= est équivalent à filename=$PWD et si il n'y a pas cette option, aucun dossier n'est sélectionné mais la fenêtre s'ouvre sur "récemment utilisés".
Voilà pour la petite histoire.

+1 pour unar, bien plus simple.

Hors ligne

#11 Le 28/01/2016, à 14:13

nany

Re : [Résolu] Extraction automatique d'un fichier.

Oh oui ! Unar simplifie effectivement les chose !
Et, effectivement, mon tilde est moisi. roll
Je ne m’en suis pas rendu compte car j’ai pour habitude de rester dans mon home (eh oui, je ne suis pas adepte du cd) d’où mon analyse qui m’a fait sortir cette statistique purement pifométrique (donc rigoureusement scientifique tongue) de 98%. wink

Du coup, je vire l’option --filename= qui ne sert finallement à rien ici. Et, pour la postérité, je reposte un script qui tient compte de tout ceci, et commenté au maximum afin que manon123, s’il revient lire ce fil, puisse un peu mieux comprendre le code (qui se retrouve aussi largement simplifié avec unar).

epub_extract.sh a écrit :
#!/bin/bash

#/*
# * ----------------------------------------------------------------------------
# * "THE BEER-WARE LICENSE" (Revision 42):
# * <nany.s@free.fr> wrote this file. As long as you retain this notice you
# * can do whatever you want with this stuff. If we meet some day, and you think
# * this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
# * ----------------------------------------------------------------------------
# *
# *
# * ----------------------------------------------------------------------------
# * "LICENCE BEERWARE" (Révision 42):
# * <nany.s@free.fr> a créé ce fichier. Tant que vous conservez cet
# * avertissement, vous pouvez faire ce que vous voulez de ce truc. Si on se
# * rencontre un jour et que vous pensez que ce truc vaut le coup, vous pouvez
# * me payer une bière en retour. nany
# * ----------------------------------------------------------------------------
# */

# Nécessite unar.

# Pour sortir avec un message et un numéro d’erreur.
clean_exit () {
echo "$2"
exit $1
}

# Boîte de dialogue de choix de répertoire.
choose_dir () {
zenity --title="$1" --file-selection --directory 2>/dev/null
}

# On indique le répertoire d’entrée.
idir=$(choose_dir "Dans quel répertoire sont les archives ?")
# Si aucun répertoire n’est donné, on sort avec le numéro d’erreur 1.
(( $? )) && clean_exit 1 "Vous n’avez pas indiqué le répertoire d’entrée."

# On indique le répertoire de sortie.
odir=$(choose_dir "Dans quel répertoire extraire les livres ?")
# Si aucun répertoire n’est donné, on sort avec le numéro d’erreur 2.
(( $? )) && clean_exit 2 "Vous n’avez pas indiqué le répertoire de sortie."

# Enfin, on procède à l’extraction avec unar
# pour les fichiers d’extensions .zip, .rar ou .7z
for file in "$idir"/*.zip "$idir"/*.rar "$idir"/*.7z
do
  unar -D -o "${odir}/" "$file" "*.epub"
done

exit 0

Il y a maintenant bien plus de lignes de commentaire que de code. lol

Hors ligne

#12 Le 29/01/2016, à 03:56

manon123

Re : [Résolu] Extraction automatique d'un fichier.

Merci nany, commenté de cette façon, c'est beaucoup plus clair. big_smile

Quant à la bière... pourquoi une seule ? Je ne bois que par paires. (j'ai pas oublié le "s" à paires) lol


Distro: Manjaro 20.1-2

Hors ligne

#13 Le 29/01/2016, à 05:46

nany

Re : [Résolu] Extraction automatique d'un fichier.

Pourquoi une seule ? Eh bien tout simplement parce que la licence, dans sa révision 42, a été rédigée ainsi. Or comme je refuse catégoriquement de faire une nouvelle révision qui aurait pour désastreuse conséquence d’incrémenter la numérotation, cela restera ainsi. big_smile

Allez, hop, tournée générale !

Et puis tiens, tant que j’y suis, je viens de penser à une amélioration (gestion d’erreur supplémentaire pour unrar) :

#!/bin/bash

#/*
# * ----------------------------------------------------------------------------
# * "THE BEER-WARE LICENSE" (Revision 42):
# * <nany.s@free.fr> wrote this file. As long as you retain this notice you
# * can do whatever you want with this stuff. If we meet some day, and you think
# * this stuff is worth it, you can buy me a beer in return Poul-Henning Kamp
# * ----------------------------------------------------------------------------
# *
# *
# * ----------------------------------------------------------------------------
# * "LICENCE BEERWARE" (Révision 42):
# * <nany.s@free.fr> a créé ce fichier. Tant que vous conservez cet
# * avertissement, vous pouvez faire ce que vous voulez de ce truc. Si on se
# * rencontre un jour et que vous pensez que ce truc vaut le coup, vous pouvez
# * me payer une bière en retour. nany
# * ----------------------------------------------------------------------------
# */

# Nécessite unar.

# Pour sortir avec un message et un numéro d’état.
clean_exit () {
echo "$2"
exit $1
}

# Boîte de dialogue de choix de répertoire.
choose_dir () {
zenity --title="$1" --file-selection --directory 2>/dev/null
}

# Si unar n’est pas installé, sortie d’état 3.
which unar &>/dev/null || clean_exit 1 "Vous devez d’abord installer unar."

# On indique le répertoire d’entrée.
idir=$(choose_dir "Dans quel répertoire sont les archives ?")
# Si aucun répertoire n’est donné, sortie d’état 1.
(( $? )) && clean_exit 1 "Vous n’avez pas indiqué le répertoire d’entrée."

# On indique le répertoire de sortie.
odir=$(choose_dir "Dans quel répertoire extraire les livres ?")
# Si aucun répertoire n’est donné, sortie d’état 2.
(( $? )) && clean_exit 2 "Vous n’avez pas indiqué le répertoire de sortie."

# Enfin, on procède à l’extraction avec unar
# pour les fichiers d’extensions .zip, .rar ou .7z
for file in "$idir"/*.zip "$idir"/*.rar "$idir"/*.7z
do
  unar -D -o "${odir}/" "$file" "*.epub"
done

# Sortie d’état 0.
exit 0


Et puis voilà pour la première paire. wink

Hors ligne

#14 Le 01/02/2016, à 01:00

manon123

Re : [Résolu] Extraction automatique d'un fichier.

Étant Belge et connaisseur, t'inquiète, on a de quoi faire... tongue big_smile


Distro: Manjaro 20.1-2

Hors ligne