#!/bin/sh #METODI PER USARE UNA STRINGA COME ARRAY # #b="Pippo Pluto Paperino";stringa="";for i in $b; do stringa="$stringa $i";done;echo $stringa # #b="Pippo Pluto Paperino"; for i in $b; do echo $i; done #se ci son meno di tre argomenti if [ $# -lt 3 ]; then #se il primo argomento corrisponde ad -h o --help o help if [ $1 = -h ] || [ $1 = --help ] || [ $1 = help ]; then echo -e "\nQuesto script ricerca file o directory nel contenuto di un pacchetto tcz indicatogli e ne divide il contenuto in due pacchetti.\n" echo -e "Potete ricercare un file specificando il suo nome oppure parte di esso utilizzando gli asterischi, es. readme.txt module*.cfg *.pyc" echo "Esempi di tipi di file che si possono voler separare possono essere:" echo "Develop: .h .c .pc .pyc" echo -e "Locales: .mo\n" echo -e "Potete ricercare una directory specificando il suo nome preceduto da /, potete usare gli asterischi anche in questo caso. Non potete specificare un path e dovete ricordare che le ricerche sono case sensitive\n" echo -e 'Potete escludere dei file o directory da quelli che verranno divisi specificando il loro nome o parte di path anteponendogli un trattino "-". Questa volta non potete usare gli asterischi per astrarre una parte di stringa.\n' echo "Alla conclusione il file originale verra' rinominato in _original.tcz, quello che manterra' il nome iniziale sara' stato privato dei file ricercati che saranno confluiti nel nuovo file <-nome_aggiuntivo>.tcz" echo -e "I file in esso confluiti saranno elencati nel file filelist.txt, le directory verranno specificate senza il loro contenuto." echo -e "All'interno del file filelist.txt.unpurged saranno elencati i file che sarebbero stati divisi senza quelli esclusi con gli argomenti preceduti dal trattino.\n" echo -e "\nCOME FUNZIONA" echo -e "Si pone lo script nella stessa directory del pacchetto da dividere e si usa questa sintassi:" echo -e "./tcz-externalizer ...|...|-\n" echo "Es:" echo "./tcz-externalizer geany.tcz -dev *.h *.la *.pc *.iface -pyconfig.h" echo -e "./tcz-externalizer geany.tcz -doc /doc -/guida/manuale\n" else echo -e "\nMi aspetto almeno 3 argomenti:" echo -e "./tcz-externalizer ... | ...|-\n" fi else # ERODEDDIR$1 is /path/to/*.tcz file PACKNAME=`echo $1 | sed 's/.*\///' | sed 's/.tcz//'` #nome pacchetto senza path ne estensione PACKSURNAME=$2 #nome aggiuntivo primo argomento ERODEDDIR=`echo "$PACKNAME"_eroded` #dir dove verranno decompressi e poi tolti i file FILTREDDIR=`echo "$PACKNAME""$PACKSRUNAME"_filtred` FILTREDLIST=`echo "$PACKNAME""$PACKSURNAME"_filelist.txt ` #echo $PACKNAME $ERODEDDIR $FILTREDDIR $FILTREDLIST if [ ! -f "$1" ]; then echo -e "\nPacchetto non esistente\n" exit 1 fi #se non esiste crea il backup del tcz originale if [ ! -f "$PACKNAME"_original.tcz ]; then cp "$PACKNAME".tcz "$PACKNAME"_original.tcz echo -e '\nComplete package renamed in "$PACKNAME"_original.tcz"\n' sleep 1 fi #clean any previous work sudo rm -rf ./$ERODEDDIR sudo rm -rf ./$FILTREDDIR sudo rm -rf ./$FILTREDLIST #unsquash *.tcz tce-load -i squashfs-tools-4.x &>/dev/null sudo unsquashfs -f -d $ERODEDDIR $1 &>/dev/null #decomprime il tcz in nomepack_eroded #Crea la lista dei file da copiare saltando gli arg. che iniziano con - shift; #skippa l'argomenti $0 al prossimo comando fino a fine script shift; #skippa l'argomenti $1 al prossimo comando fino a fine script for var in "$@"; do #trova il primo carattere FIRSTCHAR=`echo $var | sed -r 's/^(.).*$/\1/g'` if [ $FIRSTCHAR = "-" ]; then continue; #salta un giro else if [ $FIRSTCHAR = "/" ]; then DIR=`echo $var | sed 's/^.//g'` #find ./$ERODEDDIR -type d -name "$DIR" #creo la lista delle directory find ./$ERODEDDIR -type d -name "$DIR" > ./dir_temp && sleep 1 #creo un eseguibile che richiede la lista dei file per ogni directory nella lista precedente cat ./dir_temp | sed 's/^/find /g' | sed "s,$, -not -type d >> ./$FILTREDLIST,g" > ./dir_temp_exec && sleep 1 #eseguo il file eseguibile riempiendo la lista delle sostituzioni sh ./dir_temp_exec && sleep 1 echo -e "----directory /$DIR selezionate\n" rm -rf ./dir_temp ./dir_temp_exec && sleep 1 else #filtra i file contenenti l'argomento $var e li accoda in un file #find ./$ERODEDDIR -not -type d -name "$var" find ./$ERODEDDIR -not -type d -name "$var" >> ./$FILTREDLIST && sleep 1 echo -e "----file $var selezionati\n" sleep 1 fi fi done #toglie le voci ripetute nel file cp ./$FILTREDLIST ./$FILTREDLIST.unduplicate sort -u ./$FILTREDLIST.unduplicate > ./$FILTREDLIST echo -e "----doppioni rimossi\n" #Cancella dalla lista i file degli argomenti che iniziano con - cp ./$FILTREDLIST ./$FILTREDLIST.unpurged for var in "$@"; do #trova il primo carattere e il secondo carattere FIRSTCHAR=`echo $var | sed -r 's/^(.).*$/\1/g'` SECNDCHAR=`echo $var | sed -r 's/^.(.).*$/\1/g'` if [ $FIRSTCHAR = "-" ]; then PATTERN=`echo $var | sed 's/.//'` #toglie il primo carattere SAFEPATTERN=$(printf '%s\n' "$PATTERN" | sed 's/[[\.*^$/]/\\&/g') sed -i "/.*$SAFEPATTERN.*/d" ./$FILTREDLIST && sleep 1 #rimuove le righe contenenti il pattern echo -e "----pattern $PATTERN deselezionati\n" sleep 1 fi done echo -e "\nlista finale" cat ./$FILTREDLIST sleep 4 #copy dev files in filtred directory mkdir ./$FILTREDDIR #crea dir file separati cd ./$ERODEDDIR #va nella dir da separare cat ../$FILTREDLIST | sed 's/^.*'$ERODEDDIR'/\./g' | sed 's/^/sudo cp -a --parents /g' | sed 's/$/ ..\/'$FILTREDDIR'\//g' > ../copyfile #modifica la lista dei file da separare in modo che diventino comandi di copia sh ../copyfile cd ../ rm -f ./copyfile #remove externalizzation files in eroded directory cat ./$FILTREDLIST | sed 's/^/sudo rm -rf /g' > ./removefile sh ./removefile && echo -e "\n\nfile da separare rimossi\n" sleep 1 rm -f ./removefile ####remove empty folder in eroded directory ####meglio non cancellarle, non si sa mai che un programma malfunzioni #sudo find ./$ERODEDDIR -type d -depth -exec rmdir {} + 2>/dev/null && sleep 1 #echo -e "\ntolte directory vuote\n\n\n" #sleep 1 #create package with and without exernalized file rm -rf ./$PACKNAME'.tcz' mksquashfs ./$ERODEDDIR $PACKNAME'.tcz' mksquashfs ./$FILTREDDIR $PACKNAME$PACKSURNAME'.tcz' #final clean exluse the filtredlist.txt sudo rm -rf ./$ERODEDDIR sudo rm -rf ./$FILTREDDIR fi echo "" ####VECCHIO MODO DI RIMUOVERE I FILE ####pare non funzionare con liste troppo lunghe ##remove dev files in nodev directory #REMOVE=`cat ./$FILTREDLIST | sed 's/^/sudo rm -rf /g'` #$REMOVE ##remove empty folder in nodev directory #sudo find ./$ERODEDDIR -type d -depth -exec rmdir {} + 2>/dev/null #####per far funzionare le variabili con caratteri speciali all'interno di sed ho dovuto usare un SAFEPATTERN intermedio trovato in questo sito: http://backreference.org/2009/12/09/using-shell-variables-in-sed/ #safe pattern #SAFEPATTERN=$(printf '%s\n' "$PATTERN" | sed 's/[[\.*^$/]/\\&/g') #per sed -r (regex extended) il safe pattern รจ: #SAFEPATTERN=$(printf '%s\n' "$pattern" | sed 's/[[\.*^$(){}?+|/]/\\&/g')