Vos scripts bash ou autre - qui vous sert tous les jours

Pour le scan de mes cours, j’ai pondu ce petit utilitaire… car je ne sache pas que l’appli scanimage permette de faire ce dont j’ai besoin… dommage.


#! /bin/sh

FAMILYNAME=name
SCAN_NAME=EPSON
INDICE_MIN=1
INDICE=$INDICE_MIN
MODE=Gray
RESOLUTION=150

# $1 contient la chaine pour trouver le scan... bref son nom!
# cela sert si on branche ou debranche le scanner, son "nom" change alors... :(
function DETECT_SCAN {
	local SCAN_MODL
	local SCAN_MODLGR
	SCAN_MODL=$(scanimage --list | grep "$1" | cut -f 2 -d " ")
	SCAN_MODLGR=${#SCAN_MODL}
	SCAN_USB=${SCAN_MODL:1:$(($SCAN_MODLGR - 2))}
	echo "modele detecte $SCAN_USB..."
}

function DISPLAY_PARAM {
	echo "resolution $RESOLUTION, mode $MODE"
	echo "Placer le doc n°$INDICE sur le scanner"
	echo "[c|color], [n|g|gray], [+|-], [q|quit] to quit or <RETURN> to scan"
}

function SCAN_PICTURE {
	echo "scan en cours de $FAMILYNAME$INDICE.pnm..."
	scanimage --device-name=$SCAN_USB --format=pnm --resolution $RESOLUTION --mode $MODE > "$FAMILYNAME$INDICE.pnm";
	INDICE=$(($INDICE + 1))
}

function READ_ACTION {
	DISPLAY_PARAM
	read ACTION
	case "$ACTION" in
  c | color | COLOR | Color ) MODE=Color;;
  n | g | gray | Gray | GRAY ) MODE=Gray;;
  + ) RESOLUTION=$(($RESOLUTION + 50));;
  - ) RESOLUTION=$(($RESOLUTION - 50));;
  q | quit | QUIT | Quit) break;;
  * ) SCAN_PICTURE;;
	esac
}

#programme principal...
DETECT_SCAN $SCAN_NAME

while READ_ACTION; do :; done

Scanner des cours ??? Mon dieu quelle horreur ! :pt1cable:
Par contre le bash ldif2vcf est vachement bien ! :jap:

Toujours au sujet de mes scans de cours… j’ai aujourd’hui quelques gigas de cours scannés et je souhaitais pondre une page html avec l’arborescence globale du repertoire COURANT et de ses fils, et ne faire apparaitre que les PDF.
Bon, c’est pas encore completement terminé, mais je pense que je suis sur la bonne voie, à moins que qqn m’apprenne que ceci a déjà été fait par ailleurs.
Le prog pond juste l’arbo des repertoires fils à partir du repertoire en cours (ou dans la console…) en html.
PS: les images ont été trouvées sur le web, cf lien à la fin.

arbo2html.sh:


#! /usr/bin/awk -f

function SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, COL,	i) {
	i=LIGDEB+1
	while ( i<=LIGMAX && TABLEAU[i, COL]!=CASE_L && TABLEAU[i, COL]!=CASE__ ) {
  i ++
	}
	if ( TABLEAU[i, COL] == CASE_L ) {
  return i
	}
	return LIGDEB
}

function SET_EMPTY_FIELDS_with(TABLEAU, LIGMAX, COLMAX,CHAR2FILL,	i,j) {
	for ( i=1; i <= LIGMAX; i ++) {
  for ( j=1; j <= COLMAX; j ++) {
  	if ( TABLEAU[i, j] != CASE_L )
    TABLEAU[i,j]=CHAR2FILL
  }

	}
}

function SET_T_in_TAB(TABLEAU, LIGMAX, COLMAX,	i,j) {
	for ( i=1; i <= LIGMAX-1; i ++) {
  for ( j=1; j <= COLMAX; j ++) {
  	if ( TABLEAU[i, j] == CASE__ && TABLEAU[i+1, j] == CASE_L || TABLEAU[i, j] == CASE__ && TABLEAU[i+1, j] == CASE_I )
    TABLEAU[i,j]=CASE_T
  }
	}
}

function SET_HORIZ_T_in_TAB(TABLEAU, LIGMAX, COLMAX,	i,j) {
	for ( i=1; i <= LIGMAX; i ++) {
  for ( j=1; j <= COLMAX-1; j ++) {
  	if ( TABLEAU[i, j] == CASE_I && TABLEAU[i, j+1] == CASE__ )
    TABLEAU[i,j]=CASE_HORIZ_T
  }
	}
	for ( i=1; i <= LIGMAX-1; i ++) {
  for ( j=1; j <= COLMAX; j ++) {
  	if ( TABLEAU[i, j] == CASE_L && TABLEAU[i+1, j] == CASE_L ||
    TABLEAU[i, j] == CASE_L && TABLEAU[i+1, j] == CASE_I )
    TABLEAU[i,j]=CASE_HORIZ_T
  }
	}
}

function SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL, LIGDEB, i,ifin,j) {
	if ( CURRENTCOL > COLMAX ) {return}
	ifin=SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, CURRENTCOL)
	if ( LIGDEB < ifin ) {
  for ( i=LIGDEB+1; i <= ifin-1; i ++) {
  	TABLEAU[i,CURRENTCOL]=CASE_I
  }
  SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL+1, LIGDEB, ifin-1)
  SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL, ifin, LIGMAX)
	}
	else {
  ifin=SEARCH_by_COL_next_L_from(TABLEAU, LIGMAX, COLMAX, LIGDEB, CURRENTCOL+1)
  SET_I_between_L_by_COL(TABLEAU, LIGMAX, COLMAX, CURRENTCOL+1, LIGDEB, ifin)
	}
}

function SET_UNDERSCORES_after_L_by_LIG(TABLEAU, LIGMAX, COLMAX,	i,j,jbeg) {
	for ( i=1; i <= LIGMAX; i ++) {
  # un L dans la ligne??? test
  j=1
  while ( TABLEAU[i,j]!=CASE_L && j<=COLMAX ) {
  	j++
  }
  #sic, pour ne pas afficher les L pour les fichiers...
  if ( j>COLMAX ) {
  	continue
  }

  for ( j=1; j <= COLMAX; j++) {
  	if ( TABLEAU[i, j] == CASE_L ) {
    jbeg=j+1
    break
  	}
  }
  for ( j=jbeg; j <= COLMAX; j ++) {
  	TABLEAU[i,j]=CASE__
  }
	}
}

function EXTRACT_NOM_FIC_from_FULL_PATH(EXPRESSION,	TABEXPRESSION) {
	#n contient le nbre d'elements
	n=split( EXPRESSION, TABEXPRESSION, "/")
	return TABEXPRESSION[n]
}

function COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, LIG,	i, NBREP) {
	if ( IS_DIRECTORY(TABLEAU[LIG,COLMAX+1]) == 0 ) {
  #calcul du nombre de rep précédents!
  NBREP=1
  for(i=LIG; i>=1; i--) {
  	if ( IS_DIRECTORY(TABLEAU[i,COLMAX+1]) == 0 ) {
    NBREP++
  	}
  }

  if ( NBREP % 2 == 0 ) {
  	return "#b5d3f2"
  }
  return "white"
	}
	return COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, LIG-1)
}

function DISPLAY_DIR_FULL_TREE(TABLEAU, LIGMAX, COLMAX, SEP,	i,j) {
	for ( i=1; i <= LIGMAX; i ++) {
  for ( j=1; j <= COLMAX; j ++) {
  	printf "%s%s", TABLEAU[i, j], SEP
  }
  #printf "%s%s%s\n",EXTRACT_NOM_FIC_from_FULL_PATH(TABLEAU[i,COLMAX+1]), CASE_VIDE, TABLEAU[i,COLMAX+2]
  printf "%s%s%s\n",TABLEAU[i,COLMAX+1], CASE_VIDE, TABLEAU[i,COLMAX+2]
	}
}

function FILE_LINKED2(CHAR) {
	if ( CHAR == CASE_VIDE ) {
  return ""
	}
	else if ( CHAR == CASE_L ) {
  return "12.gif"
	}
	else if ( CHAR == CASE_T ) {
  return "234.gif"
	}
	else if ( CHAR == CASE_HORIZ_T ) {
  return "123.gif"
	}
	else if ( CHAR == CASE_I ) {
  return "1.gif"
	}
	else if ( CHAR == CASE__ ) {
  return "24.gif"
	}
}

function IS_DIRECTORY(EXPRESSION) {
	if ( substr(EXPRESSION, 1,2) != "./" ) {
  # il s'agit donc d'un rep...
  return 0
	}
	else {
  # sinon d'un fichier!!!
  return 1
	}
}

function DISPLAY_DIR_FULL_TREE_in_HTML(TABLEAU, LIGMAX, COLMAX,	i,j ) {
	#affichage entete...
	print "<html>"
	print "<head>"
	print "<title>Scan Cours...</title>"
	print "</head>"
	print "<body bgcolor=\"#64a4e3\" link=\"black\" alink=\"black\" vlink=\"black\">"
	print "<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0>"
	#titre de tableau dans la page html...
	#print "<CAPTION valign=\"TOP\">Scan de cours...</CAPTION>"

	print "<TR>"
	print "<TD COLSPAN=\""COLMAX+3"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\" size=\"10pt\">Scan de Cours...</FONT></TD>"
	print "</TR>"

	print "<TR>"
	print "<TH COLSPAN=\""COLMAX"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Dep.</FONT></TD>"
	print "<TH COLSPAN=\""2"\" bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Chemins et liens</FONT></TD>"
	print "<TH bgcolor=\"white\" CLASS=\"norm\" ALIGN=\"center\"><FONT color=\"#4391cc\">Taille en Mo</FONT></TD>"
	print "<TR>"

	#remplissage du tableau
	for ( i=1; i <= LIGMAX; i ++) {
  print "<TR bgcolor=\"" COLOR_TR_in_HTML(TABLEAU, LIGMAX, COLMAX, i) "\">"
  for ( j=1; j <= COLMAX; j ++) {
  	#if ( FILE_LINKED2(TABLEAU[i, j])!="" ) {
  	if ( FILE_LINKED2(TABLEAU[i, j]) ) {
    print "<TD><IMG SRC=\"" FILE_LINKED2(TABLEAU[i, j])"\" HEIGHT=20 WIDTH=20></TD>"
  	}
  	else {
    print "<TD WIDTH=20></TD>"
  	}
  }
  # faire le lien ou pas le lien??? telle est la question!
  if ( IS_DIRECTORY(TABLEAU[i,COLMAX+1])==0 ) {
  	# il s'agit donc d'un rep... => en gras
  	print "<TD> <B>" TABLEAU[i,COLMAX+1] "</B> </TD>"
  	print "<TD></TD>"
  	print "<TD ALIGN=\"center\"> " TABLEAU[i,COLMAX+2] " </TD>"
  }
  else{
  	# sinon d'un fichier!!! => proposer le lien.
  	print "<TD></TD>"
  	print "<TD> <A HREF=\"" TABLEAU[i,COLMAX+1] "\">" EXTRACT_NOM_FIC_from_FULL_PATH(TABLEAU[i,COLMAX+1]) "</A> </TD>"
  	print "<TD></TD>"
  }
  print "</TR>"
	}

	print "</body>"
	print "</html>"
}

function SET_FULL_TAB_into_HTML(TABLEAU, NOMREPTABLEAU, NOMFICTABLEAU, TAILLEREPTABLEAU, LIGMAX, COLMAX,	i,j,k,l, _LIGMAX, _COLMAX) {
	# les var avec _ devant sont relatives au tab elargi
	_LIGMAX=LIGMAX
	#necessaire si on fait pointer les fichiers!
	#_COLMAX=COLMAX+2
	_COLMAX=COLMAX
	#nb total de lig dans le nouveau tab
	for ( i=1; i <= LIGMAX; i ++) {
  _LIGMAX+=NOMFICTABLEAU[i,0]
	}

	i=LIGMAX
	_i=_LIGMAX
	while( i<_i && _i>0 ) {
  #recherche de la colonne du CASE_L dans la ligne i, (j<=COLMAX inutile, mais bon)
  j=1
  while ( TABLEAU[i,j]!=CASE_L && j<=COLMAX ) { j++ }

  #pour chaque fichier...
  for(k=NOMFICTABLEAU[i,0]; k>=1; k--) {
  	#nettoyer toute la ligne
  	for(l=1; l<=_COLMAX+2; l++) {
    TABLEAU[_i,l]=CASE_VIDE
  	}

  	#inserer nom du fic & CASE_L
  	TABLEAU[_i,_COLMAX+1]=NOMFICTABLEAU[i,k]
  	TABLEAU[_i,_COLMAX+2]=CASE_VIDE
  	#mettre un # pour ne pas pointer les fichiers...
  	#TABLEAU[_i,j+1]=CASE_L
  	_i--
  }

  #attention à l'effet de bord du '_i--' précédent qui est de trop pour ce cas là!
  #si les deux sont égaux, il faut sortir!!! il ne reste alors que les reps à
  #copier.
  if ( _i == i ) { continue }

  #nettoyer ligne
  for(l=1; l<=_COLMAX; l++) {
  	TABLEAU[_i,l]=CASE_VIDE
  }

  #recopier CASE_L, nom du repertoire et taille...
  TABLEAU[_i,j]=TABLEAU[i,j]
  TABLEAU[_i,_COLMAX+1]=NOMREPTABLEAU[i]
  TABLEAU[_i,_COLMAX+2]=TAILLEREPTABLEAU[i]
  i--
  _i--
	}

	#forcément il ne reste que des reps à copier alors...
	#le décalage n'est pas à faire, SI on a utilisé SET_EMPTY_FIELDS_with CASE_VIDE...
	#ce que je m'empresserai de faire par la suite... :)
	while ( _i > 0 ) {
  TABLEAU[_i,_COLMAX]=CASE_VIDE
  TABLEAU[_i,_COLMAX+1]=NOMREPTABLEAU[i]
  TABLEAU[_i,_COLMAX+2]=TAILLEREPTABLEAU[i]
  _i--
  i--
	}

	#completion du tableau avec les symboles "graphiques"...
	SET_UNDERSCORES_after_L_by_LIG(TABLEAU, _LIGMAX, _COLMAX)
	SET_I_between_L_by_COL(TABLEAU, _LIGMAX, _COLMAX,1,1)
	SET_T_in_TAB(TABLEAU, _LIGMAX, _COLMAX)
	SET_HORIZ_T_in_TAB(TABLEAU, _LIGMAX, _COLMAX)

	#afficher simplement dans la console...
	#DISPLAY_DIR_FULL_TREE(TABLEAU, _LIGMAX, _COLMAX, CASE_VIDE)

	#pondre une page html de tout ce bouza.
	DISPLAY_DIR_FULL_TREE_in_HTML(TABLEAU, _LIGMAX, _COLMAX)
}

#determine si c'est un rep ou non, son entrée, est la sortie de ls!
#si '.:' ou './ABC' alors ce sont des reps, sinon ben non.
function IS_DIRECTORY_from_LS(EXPRESSION) {
	if ( substr(EXPRESSION, 1,1) == "." && substr(EXPRESSION, length(EXPRESSION),1) == ":" || substr(EXPRESSION, 1,2) == "./" ) {
  # il s'agit donc d'un rep...
  return 0
	}
	else {
  # sinon d'un fichier!!!
  return 1
	}
}

BEGIN {
	LIG=0
	LIG_MAX=0
	COL=1
	COL_MAX=1

	CASE_VIDE=" "
	CASE_L="L"
	CASE_T="T"
	CASE_HORIZ_T=">"
	CASE_I="|"
	CASE__="-"

	REP_COURANT=""
}

#REMPLIR LE TABLEAU à partir de ... ce sera l'entrée du programme.
#.:
#total 144
#4 1.gif
#4 12.gif
#4 24.gif
#4 123.gif
#4 234.gif
#4 ABC/
#4 ABC'/

$1==".:" && !match($1,"/") {
	LIG=0
	COL=1
	COL_MAX=COL
	REP_COURANT="./"
}

match ($1, ":") && IS_DIRECTORY_from_LS($1)==0 {
	LIG++
	n=split($1, TABLEAUBIDON, "/")
	COL=n
	if ( COL > COL_MAX ) { COL_MAX=COL }
	TAB[LIG, COL]=CASE_L
	NOMREP_TAB[LIG]=substr(TABLEAUBIDON[n],1 ,length(TABLEAUBIDON[n])-1)
	NOMFIC_TAB[LIG,0]=0
	REP_COURANT=substr($0,1,length($0)-1)
}

NF>=2 && !match($1,":") && !match($2,"/") && !match($1, "^total") && match($1, "[0-9]") && match($2,".pdf") {
	#on a affaire à un fichier pdf!
	NOMFIC_TAB[LIG,0]++
	NOMFIC_TAB[LIG, NOMFIC_TAB[LIG,0] ]=REP_COURANT"/"$2 #substr($0, length($1)+1)
}

match ($1, "total") { TAILLEREP_TAB[LIG]=sprintf("%.2f",$2/1024) }

$1~/^$/ { next }


END {
	LIG_MAX=LIG
	COL_MAX+=1
	# on complete les cases vides avec CASE_VIDE
	SET_EMPTY_FIELDS_with(TAB, LIG_MAX, COL_MAX, CASE_VIDE)
	# ajouter le nom des fichiers/reps, et la taille au tableau qui devient alors global!
	# <-                     COL_MAX                     -><-COLMAX+1-><-COLMAX+2->
	# |      CASE_L | CASE_VIDE | CASE__ | CASE_T ...      |   NOM    |   TAILLE  |
	SET_FULL_TAB_into_HTML(TAB, NOMREP_TAB, NOMFIC_TAB, TAILLEREP_TAB, LIG_MAX, COL_MAX)
}

dans la console… pour isoler les pdf, taper:
ls -svR --format=single-column | arbo2html.sh > pagearbo.html
pour n’avoir que les repertoires…
ls -vR --format=single-column | arbo2html.sh > pagearbo.html

Voili, voilou… :slight_smile:

PS: les fichiers images peuvent être trouvés ici… (Prendre toutes les images et les mettre dans le meme repertoire que pageargo.html qui doit rester dans le rep où on a lancé le ‘ls-svr | …’!!!)
PS2: le prog ne gere pas les ESPACES ni dans les noms de fichiers ni dans les repertoires… Faudra faire une moulinette pour renommer tous vos fichiers en remplaçant le " " par “_”… :ane:

J’aime bien ton script malgrès qu’il soit un peu long, mais une petite critique fait pas de mal personnellement pour les arborescences :
il est plus aisé d’utiliser des balises html “<ul> <li> </li> </ul>” qui facilitera le traitement de ton arborescence avec une jolie feuille de style css

script un peu long, c’est vrai, mais je sais pas trop comment le raccourcir tout en le conservant un peu lisible et simple… :neutre:
Au sujet de la critique, ben je te crois volontiers pour l’utilisation de <ul> <li> </li> </ul>, mais je ne connais pas du CSS… je vais chercher un peu ce qu’il en est… Si l’envie ou le besoin te dit de le modifier, “Go ahead!!!” :clap:
See you.
PS: est-ce que la création de ces listes, ne risque pas de modifier la taille de la ligne du tableau, ce qui par voie de conséquence modifierait l’aspect esthétique… Wait and see… :confused:

Mais en fait, plus que ce pb de liste, j’aurai aimé pouvoir associer à chaque repertoire un ‘+’ ou ‘-’, tu sais comme lorsqu’il s’agit d’un explorateur, histoire de pouvoir raccourcir la page. Si on lit dans le rep, le ‘+’ se transforme en ‘-’; et inversement. A part créer tous les cas en HTML, ce qui serait absoluement HORRIBLE :ouch: :pfff: je me demandais s’il me serait possible de le faire autrement… Serait-ce dans ce cas là que le php prend tout son sens?
Merci de ta réponse Swife

pas php mais javascript mais ne me demande pas comment faire.

OK, je demande pas alors… :ane:
Merci pour l’info lithium, je vais essayer de creuser un peu… :slight_smile:

Regarde du coté de Joust. Ca pourra sans doute t’aider

-> elandal
j’ai vu l’exemple certe je pense que cela correspondra dans la forme à ce que recherche CedeRhum, mais d’après la demo il recharge à chaque clique

->CedeRhum
il y a pas mal d’applications qui se sert des ul li dans leur menu, dans le même esprit regarde ici
http://www.onlinetools.org/tools/puredom/index.html
sinon ici mais j’ai pas testé
http://www.kryogenix.org/code/browser/aqtree2/

le dernier lien à une demo qui marche parfaitement et je pense répond à tes attentes
http://www.scss.com.au/family/andrew/webde…ree/brianstree/

Il ne recharge le menu que si tu ajoutes des items si je m’en souviens bien.

Sinon pour sortir un peu du sujet. Est-ce que quelqu’un s’est essayé à faire du parsing en script shell ? J’ai voulu essayer vite fait mais j’ai pas trouvé de méthode efficace. Si quelqu’un a une piste je suis preneur…

Super pour les liens Swife et elendal, merci beaucoup. Je vous tiens au courant quand j’ai un moment pour implémenter ça, mais ça s’annonce bien. Vraiment merci! :bounce: :clap:

Un petit script à la c** que j’ai fait, ce script génère une barre de progression

je le met ici si ça peut être utile à quelqu’un :ane:



#!/bin/sh

tput clear
col=`tput cols`
nb=`ls -l|wc -l|nawk '{print $1}'`
lst=`ls -l|awk '{print $8}'`
u=`tput cup 2 0`
o=`tput cup 1 0`
v=`tput cup 5 0`
c=`tput el`
i=1
p=""

GREEN="\033[32;42m"
CYAN="\033[36;1m"
OFF="\033[0m"

txt=`echo -e "Progress Bar\nBy Swife\n2006\n"`
for t in ${lst}; do

pc=`echo "scale=3; ($i/$nb)+1"|bc`
pct=`echo "(($pc-1)*100)"|bc|nawk 'BEGIN {FS="."} {print $1}'`
pct2=`echo "(($pc-1)*($col-20))+1"|bc|nawk 'BEGIN {FS="."} {print $1}'`

j=0
p=""
while [ $j -lt $pct2 ]
do
p=${p}"="
j=$(($j+1))
done

echo -e "${o}${CYAN}[ $pct% ]${OFF}${GREEN}${p}>${OFF}${c}[ ${t} ]${u}${c}${txt}"

i=$(($i+1))

done;

echo -e "${o}${CYAN}[ 100% ]${OFF}${GREEN}${p}>${OFF}${c}[ done! ]${u}${c}${txt}"


si y en a qui veulent optimiser :miam: