======Automatisation de copie de fichiers depuis une liste===== #!/bin/bash OUTPUT_DIR="/media/bvandepo/25228E1E7D338845/films/" INPUT_FILENAME="listepouralain.txt" #fichier qui contient une liste de dossier/fichier entouré de ' old_IFS=$IFS # sauvegarde de l'ancien séparateur de champ IFS=$'\n' #le séparateur par defaut (espace) ne va pas car les noms de fichiers listés peuvent en contenir mais doivent être traités en une seule fois #on règle un nouveau séparateur de champ, le caractère fin de ligne mkdir -p ${OUTPUT_DIR} while read line #for each line of list do if [ ! -z "${line}" ]; #avoid processing empty lines then echo processing ${line} #supprime le premier caractère ' et les 2 derniers caracteres ' et \r filename=${line:1:$((${#line}-3))} echo processing ${filename} #cp "${filename}" "${OUTPUT_DIR}" rsync -av "${filename}" "${OUTPUT_DIR}" fi done < $INPUT_FILENAME IFS=$old_IFS # rétablissement du séparateur de champ par défaut =====Génération de pdf à partir de office impress===== #!/bin/bash #B. Vandeportaele 2018 OUTPUT_DIR="./pdf/" OUTPUT_FILENAME=cours_comm #check that soffice is not already run SOFFICE_RUNNING=$(pstree | grep soffice) if [ ! -z "$SOFFICE_RUNNING" ]; then echo soffice have to be closed before lauching this script! echo save your data and try pkill soffice exit -1 fi #create output directory mkdir -p ${OUTPUT_DIR} #generate list and convert files to pdf if required FILE_LIST="" while read line #for each line of list do echo processing ${line} if [ ! -z "${line}" ]; #avoid processing empty lines then OFFICE_FILE=${line} PDF_FILE="${OFFICE_FILE/".odp"/".pdf"}" PDF_FILE_WITH_FOLDER="${OUTPUT_DIR}${PDF_FILE}" # test if the office file is newer than the pdf, it works also if the pdf file is not existing if [ ${OFFICE_FILE} -nt ${PDF_FILE_WITH_FOLDER} ] then echo "this file has changed, converting it to pdf: ${OFFICE_FILE} -> ${PDF_FILE_WITH_FOLDER}" rm ${PDF_FILE_WITH_FOLDER} #convert each individual file to pdf echo "soffice --convert-to pdf --outdir ${OUTPUT_DIR} ${OFFICE_FILE}" soffice --convert-to pdf --outdir ${OUTPUT_DIR} ${OFFICE_FILE} else echo "this file has not changed, keeping the previous pdf: ${OFFICE_FILE} -> ${PDF_FILE_WITH_FOLDER}" fi #add to the list of file in variable and subsitute odp with pdf FILE_LIST="${FILE_LIST} ${OUTPUT_DIR}${line/".odp"/".pdf"}" fi done < listoffilestoconcatenate.txt #I'm obliged to use while .... in that order so the scope of ${FILE_LIST} is not only local inside the loop echo list of files: ${FILE_LIST} #concatenate the files to a single one gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=${OUTPUT_DIR}${OUTPUT_FILENAME}.pdf -dBATCH ${FILE_LIST} #count the number of pages in the concatened file # https://stackoverflow.com/questions/1672580/get-number-of-pages-in-a-pdf-using-a-cmd-batch-file NUMBEROFPAGES=$(pdfinfo "${OUTPUT_DIR}${OUTPUT_FILENAME}.pdf" | grep Pages | sed 's/[^0-9]*//') echo $NUMBEROFPAGES pages found #set the right number of pages to generate in numbers.tex from the generic numbers.in.tex file sed "s/NUMBEROFPAGESTOGENERATE/$NUMBEROFPAGES/g" ${OUTPUT_DIR}numbers.tex cat ${OUTPUT_DIR}numbers.tex #compute the pdf for pages numbers pdflatex -output-directory ${OUTPUT_DIR} ${OUTPUT_DIR}numbers.tex #merge the pdf containing the content and the pdf containing the page numbers # http://cazencott.info/index.php/post/2015/04/30/Numbering-PDF-Pages # sudo apt install pdftk if false then #split files to individual pages pdftk ${OUTPUT_DIR}numbers.pdf burst output ${OUTPUT_DIR}number_%03d.pdf pdftk ${OUTPUT_DIR}${OUTPUT_FILENAME}.pdf burst output ${OUTPUT_DIR}page_%03d.pdf for i in $(seq -f %03g 1 $NUMBEROFPAGES) ; do pdftk ${OUTPUT_DIR}page_$i.pdf stamp ${OUTPUT_DIR}number_$i.pdf ${OUTPUT_DIR}output new_$i.pdf ; done pdftk ${OUTPUT_DIR}new_???.pdf output ${OUTPUT_DIR}${OUTPUT_FILENAME}_numbered.pdf else #direct method dealing with the 2 files without merging individual pages pdftk ${OUTPUT_DIR}${OUTPUT_FILENAME}.pdf multistamp ${OUTPUT_DIR}numbers.pdf output ${OUTPUT_DIR}${OUTPUT_FILENAME}_numbered.pdf fi #generate the 6 slides per page for printing pdfnup --nup 2x3 --no-landscape -o ${OUTPUT_DIR}${OUTPUT_FILENAME}_numbered_six.pdf ${OUTPUT_DIR}${OUTPUT_FILENAME}_numbered.pdf #add annexes if required.... =====Concaténation de vidéos GOPRO===== https://trac.ffmpeg.org/wiki/Concatenate ===Mise cote à cote de 2 vidéos=== #!/bin/bash #cutting the video INFILE1="../2017_Photos/2017_11_14_gensac_parapente/VID_20171114_135427.3gp" START_TIME1="0:39" #de 39 à 53 =14 secondes #retournement à 43, soit apres 4 secondes INFILE2="../2017_Photos/2017_11_14_gensac_parapente/GOPR0844.MP4" #https://www.ffmpeg.org/doxygen/0.7/parseutils_8c-source.html#l00487 #d'après 00487 int av_parse_time(int64_t *timeval, const char *datestr, int duration) #la partie fractionnaire de secondes est exprimée en us START_TIME2="2:18.500000" #retournement à 2:23 DURATION="0:00:14" TMPDIR="/tmp/myvideo/" rm -rf $TMPDIR mkir -p $TMPDIR #INTERMEDIATEFILE="cutted.mkv" #OUTFILE="res.mkv" #ffmpeg -i $INFILE -ss $START_TIME -t $DURATION -c copy $INTERMEDIATEFILE #converting the video to images 1 mkdir -p $TMPDIR/imgs1 avconv -i $INFILE1 -r 30 -f image2 -ss $START_TIME1 -t $DURATION $TMPDIR/imgs1/im-%06d.bmp #converting the video to images 2 mkdir -p $TMPDIR/imgs2 avconv -i $INFILE2 -r 30 -f image2 -ss $START_TIME2 -t $DURATION $TMPDIR/imgs2/im-%06d.bmp #concatenate the images mkdir -p $TMPDIR/imgs3 rm $TMPDIR/list #ls -c1 *.pgm | sort >>list #genere la liste ordonnée des fichiers pgm du dossier dans un fichier list find $TMPDIR/imgs1 -type f -printf "%f\n" | grep bmp | sort >>$TMPDIR/list #pour chaque ligne de list cat $TMPDIR/list | while read line do echo ${line} convert $TMPDIR/imgs1/${line} $TMPDIR/imgs2/${line} +append $TMPDIR/imgs3/${line} rm $TMPDIR/imgs1/${line} rm $TMPDIR/imgs2/${line} done #extrait la piste audio rm $TMPDIR/audio.mp3 avconv -i $INFILE1 -ss $START_TIME1 -t $DURATION $TMPDIR/audio.mp3 #generate the movie file from file with name pattern: out-img0001.png avconv -i $TMPDIR/audio.mp3 -i $TMPDIR/imgs3/im-%06d.bmp -f avi -vcodec mpeg4 -b 4000k -g 300 -bf 2 -y ./video.mpg ===Version fonctionnelle qui génère une liste de fichier texte avant de concaténer=== #!/bin/bash #B. Vandeportaele #script to concatenate video files from the GOPRO using ffmpeg #if the filenames are not in sequence as generated by the script, a list of file can be used. The file containing the list should be #made of lines such as: file 'GOPR0650.MP4' #ffmpeg -f concat -safe 0 -i file-list_to_concatenate.txt -ss 1:16 -t 30:00 -c copy GOPR0650_complete_cut.MP4 NUMBER=0711 START_TIME="0:19" DURATION="10:00:00" rm ./filelisttoconcatenate.txt #begin with a list of 1 file echo "file './GOPR$NUMBER.MP4'" >> filelisttoconcatenate.txt #loop for 10 next files and try to detect if the file exists then add it to the list for I in `seq -w 1 10`; do file="GP$I$NUMBER.MP4" if [ -f "$file" ] then echo "$file found." # LIST="$LIST|$file" echo "file ./'$file'" >> filelisttoconcatenate.txt else echo "$file not found." fi done echo " " >> filelisttoconcatenate.txt #generate an output file name OUTFILE="GOPR${NUMBER}_completecut.MP4" #generate the command COMMAND="ffmpeg -f concat -safe 0 -i filelisttoconcatenate.txt -ss $START_TIME -t $DURATION -c copy $OUTFILE" echo "Do you want to execute the following command (y/n):" echo $COMMAND read line if [ "$line" == "y" ]; then #execute the command in the variable eval "$COMMAND" fi ===Version qui ne fonctionne pas toujours=== #!/bin/bash #B. Vandeportaele #script to concatenate video files from the GOPRO using ffmpeg #if the filenames are not in sequence as generated by the script, a list of file can be used. The file containing the list should be #made of lines such as: file 'GOPR0650.MP4' #ffmpeg -f concat -safe 0 -i file-list_to_concatenate.txt -ss 1:16 -t 30:00 -c copy GOPR0650_complete_cut.MP4 NUMBER=0711 START_TIME="0:19" DURATION="2:0:00" #construct a string that contains all the necessary file names #LIST="\"concat:GOPR$NUMBER.MP4|GP01$NUMBER.MP4\"" #LIST="GOPR$NUMBER.MP4|GP01$NUMBER.MP4|GP02$NUMBER.MP4|GP03$NUMBER.MP4|GP04$NUMBER.MP4|GP05$NUMBER.MP4|GP06$NUMBER.MP4|GP07$NUMBER.MP4|GP08$NUMBER.MP4|GP09$NUMBER.MP4" #begin with a list of 1 file LIST="\"concat:GOPR$NUMBER.MP4" echo $LIST #loop for 10 next files and try to detect if the file exists then add it to the list for I in `seq -w 1 10`; do file="GP$I$NUMBER.MP4" if [ -f "$file" ] then echo "$file found." LIST="$LIST|$file" else echo "$file not found." fi done #close the list LIST="$LIST\"" echo $LIST #on peut aussi éviter de passer par une liste de fichier et utiliser # -i "concat:input1.mpg|input2.mpg|input3.mpg" #generate an output file name OUTFILE="GOPR${NUMBER}_completecut.MP4" #generate the command COMMAND="ffmpeg -i $LIST -ss $START_TIME -t $DURATION -c copy $OUTFILE" echo "Do you want to execute the following command (y/n):" echo $COMMAND read line if [ "$line" == "y" ]; then #execute the command in the variable eval "$COMMAND" fi =====Renommage de fichier===== #!/bin/bash #exemple d'utilisation pour renommer tous les .mp4 en .avi: chext mp4 avi for file in *.$1 do #\" pour gérer les fichiers avec des espaces chaine=`echo "mv \"$file\" \"${file/$1/$2}\" "` #affichage echo $chaine #execution eval $chaine done =====Effacement automatique de plusieurs fichiers .html et dossiers _fichiers créés par firefox===== #!/bin/sh for fich in `ls *.html` do rep=`echo "$fich" | cut -d'.' -f 1 ` #echo $rep rep2=`echo "$rep""_fichiers"` #echo $rep2 #echo rm -r "$rep2" #echo "rm $fich" rm -r $rep2 rm $fich done =====Gestion de liens dynamiques===== #/bin/bash #(ne pas utiliser sh car l'IFS \n ne fonctionne pas!!!! ) #Auteur Bertrand VANDEPORTAELE 2013 #Ce script permet de construire une arborescence dans un dossier vide (définit par $DEST) dans laquelle des liens dynamiques #vont pointer vers des fichiers/dossiers respectant la même arborescence mais sur plusieurs disques distincts #Utile pour un média center avec plusieurs disques, on peut ainsi lister dans une même dossier le contenu des différents disque et naviguer comme s'il n'y avait qu'un disque #exemple: 2 disques durs /media/HD1 et /media/HD2, contenant chacun les dossiers hd et 3D #on cree sur ~/films/ les dossiers hd et 3D #puis on crée des liens symboliques de tous les fichiers /media/HD1/hd et /media/HD2/hd vers ~/films/hd # et de tous les fichiers /media/HD1/sd et /media/HD2/sd vers ~/films/sd #pour cela régler #DEST="~/films/" #LISTCAT=$'hd\nsd\n' #LISTDRV=$'/media/HD1\n/media/HD2\n' # il faut que la partition destination supporte les liens dynamiques #http://www.commentcamarche.net/faq/5027-comment-lire-un-fichier-ligne-par-ligne #http://bash.cyberciti.biz/guide/$IFS old_IFS=$IFS # sauvegarde de l'ancien séparateur de champ IFS=$'\n' #le séparateur par defaut (espace) ne va pas car les noms de fichiers listés peuvent en contenir mais doivent être traités en une seule fois #on règle un nouveau séparateur de champ, le caractère fin de ligne #emplacement pour stocker les liens dynamiques, doit pointer sur un dossier vide car on va y effacer tout les contenus des #dossiers catégories DEST="/home/bvdp/films/" #liste de noms de dossiers correspondant à des catégories #il faut le $ au début pour que le \n soit interpreté correctement comme un IFS LISTCAT=$'hd\nsd\n3D\nseries\n3Dsound\n' #liste de noms de dossiers ou rechercher les catégories LISTDRV=$'/media/HD2TO/\n/media/HD2TO2/\n/media/HD2TO3/\n/media/HD2TO4/\n/media/HD3TO1/\n/media/JY500GO\n' echo destination=$DEST #-------------------------------------------------------- #-------------------------------------------------------- #-------------------------------------------------------- #-------suppression des fichiers existants et création des dossiers si besoin--------------- rm $DEST/lnscript for i in $LISTCAT do echo $i rm $DEST/$i/* mkdir $DEST/$i #au cas ou ils n'existeraient pas done #-------------------------------------------------------- for i in $LISTCAT do echo $i #echo "next" for j in $LISTDRV do echo $j #echo "noxt" for fich in `ls $j/$i` do echo "ln -s \"$j/$i/$fich\" \"$DEST/$i/$fich\"" >>$DEST/lnscript echo $fich done done done #-------------------------------------------------------- bash $DEST/lnscript #éxecute le script de génération des liens symboliques IFS=$old_IFS # rétablissement du séparateur de champ par défaut -------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity vgaB1 is port(clk50_in : in std_logic; x : out std_logic_vector(9 downto 0); y : out std_logic_vector(8 downto 0); red_in : in std_logic; green_in : in std_logic; blue_in : in std_logic; red_out : out std_logic; green_out : out std_logic; blue_out : out std_logic; hs_out : out std_logic; vs_out : out std_logic; clk25_out : out std_logic; inside_x : out std_logic; inside_y : out std_logic); end vgaB1; architecture behavioral of vgaB1 is signal clk25 : std_logic; signal hcounter : integer range 0 to 800; signal vcounter : integer range 0 to 521; signal color: std_logic_vector(2 downto 0); signal colorb: std_logic_vector(2 downto 0); begin -- generate a 25Mhz clock process (clk50_in) begin if clk50_in'event and clk50_in='1' then clk25 <= not clk25; end if; end process; clk25_out<=clk25; --------------------------------------------------- p2: process (clk25, hcounter, vcounter) variable x: integer range 0 to 639; variable y: integer range 0 to 479; begin -- hcounter counts from 0 to 799 -- vcounter counts from 0 to 520 -- x coordinate: 0 - 639 (x = hcounter - 144, i.e., hcounter -Tpw-Tbp) -- y coordinate: 0 - 479 (y = vcounter - 31, i.e., vcounter-Tpw-Tbp) x := hcounter - 144; y := vcounter - 31; if clk25'event and clk25 = '1' then -- To draw a pixel in (x0, y0), simply test if the ray trace to it -- and set its color to any value between 1 to 7. The following example simply sets -- the whole display area to a single-color wash, which is changed every one -- second. if x < 640 and y < 480 then -- colorbv := x mod 64; --il faut une puissance de 2 forcement pour le modulo colorbv := x /64; case colorbv is when 0 => colorb<= "000"; when 1 => colorb<= "001"; when 2 => colorb<= "010"; when 3 => colorb<= "011"; when 4 => colorb<= "100"; when 5 => colorb<= "101"; when 6 => colorb<= "110"; when others => colorb<= "111"; end case; -- -- with colorbv select -- colorb<= "000" when 0, -- "001" when 1, -- "010" when 2, -- "011" when 3, -- "100" when 4, -- "101" when 5, -- "110" when 6, -- "111" when others; red_out <= colorb(0); green_out <= colorb(1); blue_out <= colorb(2); else -- if not traced, set it to "black" color red_out <= '0'; green_out <= '0'; blue_out <= '0'; end if; -- Here is the timing for horizontal synchronization. -- (Refer to p. 24, Xilinx, Spartan-3 Starter Kit Board User Guide) -- Pulse width: Tpw = 96 cycles @ 25 MHz -- Back porch: Tbp = 48 cycles -- Display time: Tdisp = 640 cycles -- Front porch: Tfp = 16 cycles -- Sync pulse time (total cycles) Ts = 800 cycles if hcounter > 0 and hcounter < 97 then hs_out <= '0'; else hs_out <= '1'; end if; -- Here is the timing for vertical synchronization. -- (Refer to p. 24, Xilinx, Spartan-3 Starter Kit Board User Guide) -- Pulse width: Tpw = 1600 cycles (2 lines) @ 25 MHz -- Back porch: Tbp = 23200 cycles (29 lines) -- Display time: Tdisp = 38400 cycles (480 lines) -- Front porch: Tfp = 8000 cycles (10 lines) -- Sync pulse time (total cycles) Ts = 416800 cycles (521 lines) if vcounter > 0 and vcounter < 3 then vs_out <= '0'; else vs_out <= '1'; end if; -- horizontal counts from 0 to 799 hcounter <= hcounter+1; if hcounter = 800 then vcounter <= vcounter+1; hcounter <= 0; end if; -- vertical counts from 0 to 519 if vcounter = 521 then vcounter <= 0; end if; end if; end process; end behavioral;