Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Appel à contributeurs. Réunion pour la refonte du wiki lundi 26 juin

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.

nombre réponses : 25

#0 -1 »  [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé. » Le 02/04/2017, à 21:12

Slyfox
Réponses : 15

Bonjour,

Voici une question concernant un script bash.

J'ai un fichier texte qui ressemble à ça (pour l'exemple)

1000 toto titi 
tata
1000  toto
titi
tata
1000 toto
titi tata

et j'aimerais avoir ça comme résultat:

1000 toto titi tata
1000 toto titi tata
1000 toto titi tata

En gros chaque fois que l'on rencontre "1000" cela provoque un retour à la ligne.

Merci

#1 Re : -1 »  [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé. » Le 02/04/2017, à 21:44

Slyfox
Réponses : 15

J'ai trouvé une solution en continuant mes recherches sur internet.

Voici une solution avec awk:

awk '$1=$1' ORS="\n1000 " RS="1000" "fichier.txt"

#2 Re : -1 »  [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé. » Le 02/04/2017, à 23:41

Slyfox
Réponses : 15

Salut Watael,

Merci pour tes explications ! cool

Watael a écrit :

et je croyais avoir lu que tu voulais faire ça en bash.
là, c'est du awk. hmm

Oui, sauf erreur de ma part on peut utiliser des commandes awk dans du bash, non ?

#3 Re : -1 »  [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé. » Le 03/04/2017, à 20:19

Slyfox
Réponses : 15

Bien que j'ai trouvé une solution à mon problème initiale qui fonctionne dans mon script bash (vu que j’utilise au tout début #! /bin/bash, je pense que c'est du bash wink) quelle serai donc la solution si je voudrais le faire en "100% full bash" ?

EDIT:
Dans mon script qui à pour but de convertir des fichiers vidéo et audio, j'utilise awk pour la recherche d'info sur les fichiers, ffmpeg pour la conversion et yad pour l'interface graphique... et là je pense que je ne dois pour faire vraiment du bash.

Après quand je lis cette page: Programmation Bash/Commandes shell, je trouve la bien la commande awk, pour être franc je n'y comprends plus rien ! roll

#4 Re : -1 »  [Résolu] Bash - Fusionner ligne fichier texte jusqu'à un mot clé. » Le 03/04/2017, à 22:42

Slyfox
Réponses : 15

Salut MicP

Un grand merci pour ta solution ! cool

#5 -1 »  FFmpeg demande explication de "bufsize" » Le 09/11/2016, à 13:45

Slyfox
Réponses : 4

Bonjour,

J’utilise FFmpeg pour convertir mes vidéos et voici une ligne de commande:

ffmpeg -i input.mkv -c:v libx264 -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.mkv

Je ne comprends pas vraiment à quoi sert l'option "bufsize" dans cet exemple ?

Merci d'éclairer ma lanterne. smile

#6 Re : -1 »  FFmpeg demande explication de "bufsize" » Le 13/11/2016, à 19:15

Slyfox
Réponses : 4

Salut moko138

Merci de me répondre.

Voici ce que dit le man traduit  (que j'avais déjà consulté avant de poser ma question).

Traduction française

-bufsize 
Définit la taille du tampon du vérificateur tampon vidéo (en bits).

Lien du man de ffmpeg: https://linux.die.net/man/1/ffmpeg

Me voilà bien avancé, je ne comprends pas en quoi ce tampon à comme utilité ?

#7 Re : -1 »  FFmpeg demande explication de "bufsize" » Le 14/11/2016, à 22:10

Slyfox
Réponses : 4

Merci d'avoir pris la peine de me répondre, effectivement maintenant j'y vois déjà un peu plus claire suite aux info que tu donnes ci-dessus.

moko138 a écrit :

En l'absence d'explications complémentaires, il te reste à faire des essais avec des valeurs différentes pour en mesurer l'effet sur la vitesse d'encodage et - peut-être - sur la qualité du résultat.

Voici un test que j'ai fait:

Vidéo originale (sans audio pour pas influencer le résultat du test): Débit de 1683 kb/s

Duration: 00:22:57.86, start: 3.742000, bitrate: 1683 kb/s
    Stream #0:0: Video: h264 (High), yuv420p(progressive), 720x544, SAR 1:1 DAR 45:34, 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)

Maintenant j'aimerais faire une vidéo de 1000 kb/s avec l’option bufsize à 2000k (2x le débit, 1000 x 2= 2000)


Voici la ligne de commande  -bufsize 2000k:

ffmpeg -i noaudio.mkv -c:v libx264 -b:v 1000k -minrate 1000k -maxrate 1000k -bufsize 2000k -c:a copy outvideo.mkv

j’obtiens une vidéo avec un débit de 909 kb/s:



Voici la ligne de commande  -bufsize 1000k:

ffmpeg -i noaudio.mkv -c:v libx264 -b:v 1000k -minrate 1000k -maxrate 1000k -bufsize 1000k -c:a copy outvideo.mkv

j’obtiens une vidéo avec un débit de 844 kb/s:



Même test mais sans l'option "bufsize", voici la ligne de commande:

ffmpeg -i invideo.mkv -c:v libx264 -b:v 1000k -minrate 1000k -maxrate 1000k outvideo.mkv

J’obtiens une vidéo avec un débit de : 989 kb/s


Conclusion il semble que je me reproche plus du débit demandé (1000 kb/s) sans l'option "bufsize".

EDIT

J'ai refait le test avec l'option -bufsize 2000k mais en 2 pass:

ffmpeg -i noaudio.mkv -c:v libx264 -b:v 1000k -minrate 1000k -maxrate 1000k -bufsize 2000k -pass 1 -f mp4 /dev/null
ffmpeg -i noaudio.mkv -c:v libx264 -b:v 1000k -minrate 1000k -maxrate 1000k -bufsize 2000k -pass 2 out.mkv

Et j'obtiens un débit de 966 kb/s, donc proche du résultat des 1000kb/s.

#8 -1 »  YAD - Problème avec bouton BTN » Le 11/09/2016, à 14:18

Slyfox
Réponses : 2

Bonjour,

Voilà un exemple très simplifié de mon problème:

#!/bin/bash

yad --form \
--text="Cliquez sur le bouton ci-dessous pour voir le calendrier" \
--field="Suivant et fermer cette fenêtre":BTN

yadPid="$?"

if 	[[ "${yadPid}" = "5" ]]; then
		yad --calendar
fi

J'aimerais quand je clique sur le bouton "Suivant et fermer cette fenêtre" que la fenêtre se ferme via un bouton BTN et par la même occasion récupérer le code de sortie et si le code sortie correspond à "5" la boîte de dialogue "calendar" s'ouvre.

Comment faire ?

#9 Re : -1 »  YAD - Problème avec bouton BTN » Le 19/09/2016, à 18:13

Slyfox
Réponses : 2

Salut le-peyo smile

Merci de me répondre. cool
Voici ce que j'ai fait avec ta proposition.

#!/bin/bash

yad --title="test" \
--text="<b><u>Faites votre choix</u></b>" \
--button="Annuler:1" \
--button="Calendrier:0" \
--button="Fichier:2" 
    
	case $? in
		0)
			yad --calendar;;
		1)
			exit;;
		2)
			yad --file;;	
	esac

Mais dans ma question initiale je désire faire ça avec un bouton BTN et après avoir longuement chercher je n'ai pas trouvé de solution (pour le moment) avec yad.
Par contre je suis entrain d'apprendre le Python (j'ai commencé il y a 3 jours). Et je pense que le module Tkinter ou même Glade devrait me permettre de réaliser une interface graphique avec plus de possibilités. Le but est de créer une petite interface graphique pour convertir les vidéos avec FFmepg. Je fais ce programme dans un but ludique et d’apprentissage... et il y a encore beaucoup beaucoup de travail et de grattage de tête! lol

#10 -1 »  [Résolu] Bash - Variable vide dans boucle for » Le 27/08/2016, à 11:46

Slyfox
Réponses : 8

Bonjour smile

Voici un mini script qui permet de tester si "var" est vide ou des fichiers ou des dossiers:

#! /bin/bash

var="/home
/home/$USER"

old_IFS=${IFS} 	# sauvegarde IFS
IFS=$'\n'	# modification de l'IFS pour qu'il passe en saut de ligne

message=$(for i in ${var}; do

	if  [[ -z "${i}" ]]; then
		echo -e "La variable est vide"
		
	elif	[[ -d ${i} ]]; then
			echo -e "${i} est un dossier"

	elif	[[ -f ${i} ]]; then
		echo -e "${i} est un fichier"
	fi

done)

echo -e "Voici le résultat du test: \n${message}"

IFS=$old_IFS 	# IFS par défaut

Le problème si je fais le test avec une variable "vide" il ne fonctionne pas car normalement il devrait me retourner "La variable est vide". roll

#! /bin/bash

var=""

old_IFS=${IFS} 	# sauvegarde IFS
IFS=$'\n'	# modification de l'IFS pour qu'il passe en saut de ligne

message=$(for i in ${var}; do

	if  [[ -z "${i}" ]]; then
		echo -e "La variable est vide"
		
	elif	[[ -d ${i} ]]; then
			echo -e "${i} est un dossier"

	elif	[[ -f ${i} ]]; then
		echo -e "${i} est un fichier"
	fi

done)

echo -e "Voici le résultat du test: \n${message}"

IFS=$old_IFS 	# IFS par défaut

Pourquoi ?

Edit
Remplacement de IFS=old_IFS     # IFS par défaut par IFS=$old_IFS     # IFS par défaut (poste #3)

#11 Re : -1 »  [Résolu] Bash - Variable vide dans boucle for » Le 27/08/2016, à 11:56

Slyfox
Réponses : 8

Je viens d'essayer de mettre des guillemets à cette ligne:

message=$(for i in "${var}"; do

Cette fois cela fonctionne pour la variable vide mais plus pour le test des fichiers ou dossiers.

#12 Re : -1 »  [Résolu] Bash - Variable vide dans boucle for » Le 27/08/2016, à 12:40

Slyfox
Réponses : 8

Salut pingouinux smile

J'ai bien compris ce que tu expliques ci-dessus.
Mais ça veut dire que ce n'est pas possible de tester une variable vide avec d'autre condition dans une boucle for ?

Edit:
J'ai remplacé au post #1 IFS=old_IFS     # IFS par défaut IFS=$old_IFS     # IFS par défaut
Merci pour la remarque.

#13 Re : -1 »  [Résolu] Bash - Variable vide dans boucle for » Le 27/08/2016, à 13:03

Slyfox
Réponses : 8

C'est bon je crois que j'ai trouvé, c'est pas très propre mais ça marche.

Exemple avec plusieurs dossiers:

#! /bin/bash

var="/home
/home/$USER"

old_IFS=${IFS} 	# sauvegarde IFS
IFS=$'\n'	# modification de l'IFS pour qu'il passe en saut de ligne


if 	[[ -z "${var}" ]]; then
		message="La variable est vide"

else	message=$(for i in ${var}; do
		
		if	[[ -d ${i} ]]; then
				echo "${i} est un dossier"

		elif	[[ -f ${i} ]]; then
				echo "${i} est un fichier"
		fi

	done)
fi


echo -e "Voici le résultat du test: \n${message}"

IFS=$old_IFS 	# IFS par défaut

Exemple avec variable vide:

#! /bin/bash

var=""

old_IFS=${IFS} 	# sauvegarde IFS
IFS=$'\n'	# modification de l'IFS pour qu'il passe en saut de ligne

if 	[[ -z "${var}" ]]; then
		message="La variable est vide"

else	message=$(for i in ${var}; do
		
		if	[[ -d ${i} ]]; then
				echo "${i} est un dossier"

		elif	[[ -f ${i} ]]; then
				echo "${i} est un fichier"
		fi

	done)
fi

echo -e "Voici le résultat du test: \n${message}"

IFS=$old_IFS 	# IFS par défaut

#14 Re : -1 »  [Résolu] Bash - Variable vide dans boucle for » Le 27/08/2016, à 13:39

Slyfox
Réponses : 8

Et ben voilà quelque chose de propre et de pro ! cool

Merci du coup de main et d'avoir pris du temps pour résoudre ce problème.

Sinon en moralité une variable vide dans une boucle for c'est possible mais c'est moche ! lol

#15 -1 »  [Résolu] Bash - Mettre paramètre d'une commande dans une variable. » Le 21/08/2016, à 23:53

Slyfox
Réponses : 12

Bonjour,

Je fais un script complexe et je me heurte à un problème que je simplifie dans cette discussion (c'est juste un principe).

Voici le script qui fonctionne:

#! /bin/bash

ls -l "mon dossier"

Rien de compliquer ! mais maintenant j'aimerais bien mettre une partie de la commande dans un variable du style:

#! /bin/bash

var="-l  mon dossier"
ls "${var}"

J'ai essayer passablement de chose enlever le {}, supprimer les " ", mettre de ' ' ou de ` ` mais rien ne va et le fait que le dossier à nom avec espace cela complique la chose mais je dois faire avec, bien que je crois qu'il faut utilisé IFS=$'\n'

Je pense que c'est basique mais comment faire ?

Merci de partager votre savoir.

#16 Re : -1 »  [Résolu] Bash - Mettre paramètre d'une commande dans une variable. » Le 22/08/2016, à 15:28

Slyfox
Réponses : 12

Merci à tous pour ces réponses claires et précises ! Je m'endormirai moins bête ce soir ! cool

Par contre je profite de cette discussion et de votre savoir pour que vous m'apporter quelque précisions.

1. Pourquoi eval est-il dangereux ou pas bien ?

2. Désolé pour le hors sujet... Dans un test if je vois que des fois qu'on utilise les simples crochets [ ] et parfois les doubles [[ ]] quelle est la différence et le plus recommandé ?

3. On voit plusieurs manière d'écrire une variable comme $var ou ${var} ou "$var" ou "${var}" ... d'habitude j'utilise "{var}" surtout si j'ai une variable avec un ou des espaces, mais quelle est la manière d'utilisation la plus recommandé ?

Merci smile

#17 Re : -1 »  [Résolu] Bash - Mettre paramètre d'une commande dans une variable. » Le 22/08/2016, à 15:50

Slyfox
Réponses : 12
Watael a écrit :

Slyfox, quel est l'intérêt de procéder ainsi ?

En fait je fait un script pour convertir les vidéos avec yad comme interface graphique et ffmpeg pour la partie conversion.

Le script fonctionne ainsi, une fenêtre s'ouvre et l'utilisateur choisit les options comme le conteneur, le codec vidéo et audio, le crf, le preset...

Voici un extrait très simplifié des variables une fois les choix effectués (ils sont multiples):

#!/bin/bash

video="-c:v libx264"
crf="-crf 28"
audio="-c:a copy"
supTag="-map_metadata -1"
newTag="-metadata title="
newVideo="ma nouvelle vidéo"

ffmpeg -y -i "video.avi" ${video} ${crf} ${audio} ${supTag} ${newTag}"${newVideo}" "video.mkv"

Pour éviter de récrire complètement chaque ligne de commande de ffmpeg pour chaque choix (une bonne trentaine) j'ai préféré opté par la modification des variables elles même via un gros test if...

EDIT
Ma question initiale venait du fait que j'avais un problème avec la variable newTag car je l'écrivais faussement ainsi:

newTag="-metadata title=${newVideo}"

#18 Re : -1 »  [Résolu] Bash - Mettre paramètre d'une commande dans une variable. » Le 27/08/2016, à 12:04

Slyfox
Réponses : 12

Merci à tous pour les solutions apportées ! smile

Je passe cette discussion en résolu.

#19 -1 »  [Résolu] Awk recherche avec plusieurs valeurs dans boucle for » Le 23/08/2016, à 19:18

Slyfox
Réponses : 8

Bonjour,

J'ai un problème avec awk...

J'ai un fichier qui s'appelle langue.txt et contient ça:

Français
Allemend
Anglais
Japonais

... pas grand chose c'est juste pour le principe.

Maintenant le script demande quelle langue parle t'on, moi je répond par exemple "Français et Anglais", ce qui revient à dire que la variable langue vaut ça:

langue="Français Anglais"

Maintenant j'aimerais rajouter TRUE devant Français et Anglais
et FALSE devant Allemand et Japonais, voici comment de vois la chose:

#! /bin/bash

read -p 'Quelles langues parlez-vous? : ' langue

echo "${langue}"

for i in ${langue}; do

	awk '{

	if ($1=="'${i}'") 
		{printf "TRUE|%s\n" ,$0}

	else {printf "FALSE|%s\n" ,$0}
	}' langue.txt

done

Mais cela me retourne ça:

TRUE|Français
FALSE|Allemend
FALSE|Anglais
FALSE|Japonais
FALSE|Français
FALSE|Allemend
TRUE|Anglais
FALSE|Japonais

J'ai compris pourquoi... pour la simple raison que la boucle for prends d'abord "Français" et affiche le résultat puis refait la même chose avec Anglais d'où le "doublage" de lignes.

Mais comment faire pour obtenir un résultat qui ressemble (dans cet exemple) à ça:

TRUE|Français
FALSE|Allemend
TRUE|Anglais
FALSE|Japonais

Merci, je pense que c'est relativement simple mais moi là j'ai besoin de votre aide (ça fait 4h que je cherche...)

#20 Re : -1 »  [Résolu] Awk recherche avec plusieurs valeurs dans boucle for » Le 23/08/2016, à 20:20

Slyfox
Réponses : 8

Salut pingouinux;

Trop fort! cool merci vraiment! smile

Sinon penses-tu que c'est réalisable avec awk ?

C'est juste pour savoir si awk est à la hauteur pour ce genre de script et si je me suis pris le chou inutilement pendant plus de 4h à vouloir faire ça avec awk.

#21 Re : -1 »  [Résolu] Awk recherche avec plusieurs valeurs dans boucle for » Le 23/08/2016, à 21:36

Slyfox
Réponses : 8
Slyfox a écrit :

Sinon penses-tu que c'est réalisable avec awk ?

Et en plus j'ai le choix ! vraiment merci à vous 2, trop la classe ! cool cool cool

Juste en passant je ne comprends pas ça:

"\x5c<"$0"\x5c>"

#22 -1 »  [Résolu] Disque externe ne monte plus, perte de donnée ? » Le 11/08/2016, à 19:32

Slyfox
Réponses : 4

Bonjour smile

Je crois que la c'est la catastrophe ! sad sad sad

Je m'explique. J'ai un disque dur WD de 5 Tio où j'ai toutes mes données importantes (environ 2.5 Tio). Hier j'ai effectué plusieurs opérations: création d'une clé USB pour pour réinstaller mon système et une réinstallation de tout mon système. D'habitude je débranche mon disque externe lors de réinstallation importante, mais j'ai complètement oublier de le faire ! (mais peut-être que ça aucun rapport avec le problème qui va suivre ?)

Une fois ma Debian installer, je reboote et j'ai ce message qui s'affiche:

1470936169.png

J'y comprends pas grand chose... hormis que cela doit concerner mon disque externe.

Je vais voir ce que me dit Gpardet, pas mieux:

1470936289.png

1470936244.png

Voilà le retour de dmesg|tail

[ 1019.306383]  sdc:
[ 1029.440692]  sdc:
[ 1257.800068] systemd[1]: apt-daily.timer: Adding 11h 10min 44.704570s random time.
[ 1260.431957] systemd[1]: apt-daily.timer: Adding 6h 8min 36.585257s random time.
[ 1260.608552]  sdc:
[ 1262.650815]  sdb: sdb1
[ 1263.770382]  sdc:
[ 1284.235452]  sdc:
[ 1285.544924] systemd[1]: apt-daily.timer: Adding 4h 20min 18.282880s random time.
[ 2442.010171] isofs_fill_super: bread failed, dev=sdc, iso_blknum=17, block=-2147483648

Ce que je trouve bizarre c'est mon disque externe fait 5 Tio et Gpardet n'affiche que la moitié.

Sauf erreur de ma part ce disque (quand il fonctionnait) devait d'être en NTSF.

J'ai aussi essayé de le monté sur Win, lui vois qu'il a un disque branché sur le port USB rien de plus.

Voilà si vous pourriez m'aider à récupérer plus de 3 ans de dur labeur ça serait vraiment le bienvenu ! cool

#23 Re : -1 »  [Résolu] Disque externe ne monte plus, perte de donnée ? » Le 11/08/2016, à 21:57

Slyfox
Réponses : 4

Quand j'ai voulu créé ma clé USB bootable, j'ai utilisé les fameuses commandes:

sudo fdisk -l
sudo umount /dev/sdx
sudo dd if=image.iso of=/dev/sdx bs=4M && sync

alors à ce moment j'ai peut-être dû me tromper de disque,  il suffit de de noter /dev/sdb au lieu de /dev/sdd... et c'est goal ! sad

En supposant que ça soit le cas, ça veut dire que j'ai tout perdu ? Car même tesdisk ne semble rien trouvé.

#24 Re : -1 »  [Résolu] Disque externe ne monte plus, perte de donnée ? » Le 12/08/2016, à 20:15

Slyfox
Réponses : 4

Bonne nouvelle!

J'ai lancé "photophore" en début d'après-midi et il est entrain de me retrouver quasiment toutes mes vidéos et documents importants !!! smile smile smile

Il semble que tout ne soit pas effacé, à suivre... smile

Edit:
J'ai pu récupérer environ 80% de mes vidéos et documents grâce à photophore.

Merci pour cette astuce ! cool