[Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości katalogu

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
Awatar użytkownika
Serantor
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 16 maja 2008, 20:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86_64

[Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości katalogu

Post autor: Serantor »

Witam, mam kilka problemów, z którymi nie potrafię sobie poradzić, będę wdzięczny za każdą pomoc.

1)
Mam pętlę while:

Kod: Zaznacz cały

sc=$(/home/user/folder/*
while [ -e $sc ]
do
fr=$(ls /home/user/folder/nazwa* | head -1)
polecenie ze zmienną $fr
rm -f $fr
done
Polecenie powinno być wykonywane do momentu, w którym w foderze /home/user/folder/ nie będzie żadnych plików nazwa*, zamiast tego sypie mi błędami 'nie znaleziono pliku pasującego do podanej lokalizacji'. Czyli pętla zamiast się skończyć leci dalej.

2)
Potrzebuję żeby skrypt skrypt.sh był uruchamiany za każdym razem gdy w folderze /home/user/cos/ pojawi się nowy plik lub folder. I tak w kółko, nowy folder, skrypt uruchamia się dla i pobiera ścieżkę folderu do zmiennej i wykonuje określone polecenia.

3) W jaki sposób pobrać nazwę kolejnego pliku/katalogu w danej lokalizacji? Potrzebuję napisać pętlę, która będzie wykonywała polecenia dla pierwszego pliku/katalogu w folderze, po zakończeniu dla drugiego, dla trzeciego itd aż do 'obsłużenia' wszystkich katalogów. Po dodaniu nowego pliku/katalogu skrypt uruchamia się właśnie dla niego (tak jak w punkcie 2.)


Z góry dziękuję za wszelką pomoc
verdorben
Wytworny Kaczor
Wytworny Kaczor
Posty: 470
Rejestracja: 30 mar 2009, 18:00
Płeć: Mężczyzna
Wersja Ubuntu: inny OS
Środowisko graficzne: MATE
Architektura: ARM

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: verdorben »

A co to ma być?
sc=$(/home/user/folder/*

Ja bym zrobił to tak
( cd gdzieś
sc=`tree -fi --noreport`
twój kod )

albo np. tak
( cd gdzieś
sc=`find . -type f`
twój kod )

katalogi "zbierasz" za pomoca - find . -type d
perl -e 'print $i=pack(c5,(41*2),sqrt(7056),(unpack(c,H)-2),oct(115),10);'
Inny OS: PLD Linux
Awatar użytkownika
Serantor
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 16 maja 2008, 20:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: Serantor »

Niestety chyba znowu robię coś źle. Skrypt wygląda w tej chwili tak:

Kod: Zaznacz cały

( cd /home/user/folder/
sc=`find . -type d`
while [ -e $sc ]
do
fr=$(ls /home/user/folder/ | head -1)
perl /home/user/skrypt.sh $fr login haslo
rm -f $fr
done
)
Po wykonaniu problem taki sam jak wcześniej: wszystko jest ok do momentu, w którym w /home/user/folder/ znajdują się pliki. Potem wysypuje się błąd skryptu w perlu, który nie otrzymuje wartości ze zmiennej $fr. Jeśli dobrze myślę po opróżnieniu /home/user/folder/ wszystko co między do, a done powinno zostać pominięte, a tak nie jest.
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: dawidgarus »

1. jaki sens ma dawanie całego kodu w nawias?
2. dlaczego skrypt sh wykonujesz w perlu?
3. cały kod jest bez sensu. taki sam efekt uzyskasz listując wszystkie pliki.

Kod: Zaznacz cały

cd /home/user/folder/
for fr in $(find .); do
  perl /home/user/skrypt.sh $fr login haslo
  rm -f $fr
done
Awatar użytkownika
Serantor
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 16 maja 2008, 20:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: Serantor »

Bardzo dziękuję, wszystko działa jak należy :)
Chaos w kodzie jest spowodowany moim ledwo początkiem nauki basha i potrzebą posiadania tego skryptu jak najszybciej, co wygooglam to staram się dostosować do swoich potrzeb.

Pozostaje jeszcze jeden problem:

Załóżmy, że w w pliku /home/user/cos/ pojawia się kilka nowych folderów i plików, w jaki sposób automatycznie uruchomić skrypt dla każdego z tych plików/folderów? Skrypt dla każdego z nich musi być uruchamiany niezależnie (raz uruchamia się dla pliku a, drugi raz dla b, trzeci dla c itd lub dla pliku b uruchamia się dopiero po zakończeniu pracy z plikiem a, dla c po zakończeniu z b itd)
dawidgarus
Wytworny Kaczor
Wytworny Kaczor
Posty: 418
Rejestracja: 09 lut 2007, 23:17
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86
Kontakt:

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: dawidgarus »

Skrypt dla każdego z nich musi być uruchamiany niezależnie (raz uruchamia się dla pliku a, drugi raz dla b, trzeci dla c itd lub dla pliku b uruchamia się dopiero po zakończeniu pracy z plikiem a, dla c po zakończeniu z b itd)
a można trochę jaśniej?


będziesz musiał wstawić kod w pętle, która co pewien czas (np. co sekundę) sprawdzała, czy nie pojawił się nowy plik:

Kod: Zaznacz cały

cd /home/user/folder/
while [ 1 ]; do
  for fr in $(find .); do
    perl /home/user/skrypt.sh $fr login haslo
    rm -f $fr
  done
  sleep 1s
done
Awatar użytkownika
Serantor
Piegowaty Guziec
Piegowaty Guziec
Posty: 7
Rejestracja: 16 maja 2008, 20:28
Płeć: Mężczyzna
Wersja Ubuntu: 9.10
Środowisko graficzne: GNOME
Architektura: x86_64

Odp: [Bash]Warunek zakończenia while i wywoływanie skryptu po zmianie zawartości kata

Post autor: Serantor »

Niech katalog /home/user/cos/ będzie pusty.
Po dodaniu folder1, plik1, plik2, skrypt uruchamia się dla folder1, potem dla plik1 i na końcu dla plik2. Za jakiś czas dodawane są folder2, folder3, plik3 (czyli zawartość /home/user/cos/ to folder1, folder2, folder3, plik1, plik2, plik3) i tym razem skrypt uruchamia się dla folder2, potem dla folder3 i w końcu dla plik3. I tak za każdym razem kiedy dodawane będą nowe pliki. Z tym, że dowolny z plików może zostać ręcznie usunięty i TYLKO ręcznie, skrypt ma ich nie ruszać.

Przy pętli, którą podałeś skrypt wykonywany jest cały czas na tym samym folderze.

EDIT: Pliki/foldery będą miały losowe nazwy więc nie mogą być brane pod uwagę.
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 8 gości