Zagnieżdżone wchodzenie do katalogów i wywoływanie funkcji w tle

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
poliman-pl
Piegowaty Guziec
Piegowaty Guziec
Posty: 1
Rejestracja: 22 mar 2018, 15:28
Płeć: Mężczyzna
Wersja Ubuntu: 16.04
Środowisko graficzne: Brak
Architektura: x86_64

Zagnieżdżone wchodzenie do katalogów i wywoływanie funkcji w tle

Post autor: poliman-pl » 22 mar 2018, 15:30

Witam serdecznie. Ostatnio zrobiłem dwa skrypty w bash:

Kod: Zaznacz cały

#!/bin/bash
#Pass path as an argument to script ./cleaner /path/to/cleaning
#create 124MB filename.gz -> fallocate -l 124M filename.gz
echo "Script for deleting not necessary archived log files."
cd $1
   
function clearFiles()
{
	for directory in *
	do
		if [ -d "$directory" ] && [ ! -L "$directory" ]
		then
			cd $directory
			x="*.gz"

			for plik in $x
			do
				if [ -e $plik ]
				then
					echo "LogFile '$plik' exists and can be deleted"
					echo "Deleting file $plik":
					#rm $plik
					echo -ne '##               (20%)\r'
					sleep 0.5
					echo -ne '####             (40%)\r'
					sleep 0.5
					echo -ne '######           (60%)\r'
					sleep 0.5
					echo -ne '########         (80%)\r'
					sleep 0.5
					echo -ne '##########       (100%)\r'
					echo -ne '\n'
					echo -e "$plik deleted \n"
				else
					echo "I think in $directory currently is nothing to delete."
				fi
				#clearFiles
			done
			#clearFiles
			cd ..
			#clearFiles
		else
			echo "$directory does not contain any archived file or it's a file."
		fi
	done
	echo "Script is finishing his job."
}

#Call function
clearFiles
oraz

Kod: Zaznacz cały

#!/bin/bash

#Script for removing trashes after deinstalled old kernels by apt-get autoremove

function progressBar()
{
    echo -ne "Please wait\n"
    while true
    do
        echo -n "#"
        sleep 2
    done
}


function clearOldKernel()
{
    x=$(dpkg --list | grep -i linux-image | grep ^rc | awk '{print $2}')

    #if [ ${#x[@]} -gt 0 ]
    if [ -z "$x" ]
    then
        echo "Your system has not any old kernels to deletion."
    else
        echo "Below is the list of old kernels:"
        echo " "
        echo "$x"
        echo " "
        for plik in $x
        do
            echo "Do you want remove $plik? (answer <yes> or hit enter if not sure)"
            read answer
            if [ "$answer" = "yes" ]
            then
                echo "Deleting file $plik":
                apt-get --purge remove $plik
                echo -e "$plik deleted \n"
            else
                echo "You wasn't sure you want remove old kernels."
                exit 1
            fi
        done
    fi
    echo
    echo "-------------------------------------------------------------- "
    echo "I have done my job, cya later."
}

#Start in background
progressBar &


#Save PID progressBar to variable
MYSELF=$!

#call clearing function
clearOldKernel

#kill progressBar function
kill $MYSELF > /dev/null 2>&1
Założeniem pierwszego skryptu jest usuwanie plików zarchiwizowanych w katalogu w podanej ścieżce jako parametr skryptu. Ogólnie wszystko gra, ale skrypt nie potrafi wejść do katalogu znajdującego się w katalogu w celu ewentualnego usunięcia śmieci. Pytanie jak to należy zrobić?
Natomiast drugi skrypt ma na celu usunięcie śmieci pozostałych po usunięciu starych wersji kernela linuxa. Jest jednak mały "smaczek" - przynajmniej z założenia. Otóż w trakcie usuwania danego "śmiecia" pojawić się powinien pasek postępu, który co 2s dorzuca kolejnego hasha w konsoli. Ciężko opisać co się dzieje i jak to wygląda, więc bardzo będę wdzięczny jeśli po prostu uruchomicie ów skrypt. Możecie zakomentować linię "apt-get --purge remove $plik", aby nic się nie usuwało, a jedynie pojawiły się odpowiednie komunikaty.

Mam też trzeci skrypt, na bazie którego powstał ten do usuwania śmieci po kernelach i tam elegancko działa rysowanie progress bara - również możecie go przetestować tylko funkcji "backup" trzeba zapewnić istniejące (najlepiej większe komendą np. fallocate -l 124M filename.gz) pliki:

Kod: Zaznacz cały

#!/bin/bash

function progress()
{
   echo -ne "Please wait\n"
   while true
   do
      echo -n "#"
      sleep 3
   done
}

function backup()
{
    tar -cvf test.tar test >/dev/null 2>&1
}

#Start in background
progress &

#Save progress() PID to variable - need to use the PID to kill the progress func
MYSELF=$!

#Start doing backup - call function
backup

echo
echo "done"

# Kill progress
kill $MYSELF > /dev/null 2>&1
ODPOWIEDZ

Wróć do „Programowanie”