Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
witam zrobilem sobie skrypt ktory sprawdza zawartosc folderu (zmienna $1) i segreguje pliki do wybranych katalogów
#!/bin/bash a=~/ strzalka="\033[0;31m>>\e[0m" images="${a}Obrazy/" winexe="${a}Instalacja_Windowsa/" docs="${a}Dokumenty/" archives="${a}Archiwa/" music="${a}Muzyka/" dir=$1 for muzyka in $1*.mp3 $1*.wav do if [[ -e $muzyka && $1 != $music ]];then mv "$muzyka" "$music" echo -e "$muzyka $strzalka $music" fi done for obrazy in $1*png $1*jpg $1*gif $1*psd $1*PSD do if [[ -e $obrazy && $1 != $images ]];then mv "$obrazy" "$images" echo -e "$obrazy $strzalka $images" fi done for txt in $1*txt $1*doc $1*odt do if [[ -e $txt && $1 != $docs ]];then mv "$txt" "$docs" echo -e "$txt $strzalka $docs" fi done for arch in $1*tgz $1*gz $1*rar do if [[ -e $arch && $1 != $archives ]];then mv "$arch" "$archives" echo -e "$arch $strzalka $archives" fi done
chce aby skrypt był przypisany dla jednego folderu np na pulpicie, przeciągał bym tam pliki typu muzyka itd a skrypt co minute segregował by dane.
W cronie mam dopisana linijke
tazz@Phoenix:~$ crontab -l # m h dom mon dow command */1 * * * * ./for.sh ~/Others
problem jest taki, ze jak odpalam skrypt poprzez polecenie sh for.sh ~/Others
dostaje wynik
tazz@Phoenix:~$ sh for.sh ~/Others for.sh: 18: [[: not found for.sh: 18: [[: not found for.sh: 26: [[: not found for.sh: 26: [[: not found for.sh: 26: [[: not found for.sh: 26: [[: not found for.sh: 26: [[: not found for.sh: 34: [[: not found for.sh: 34: [[: not found for.sh: 34: [[: not found for.sh: 42: [[: not found for.sh: 42: [[: not found for.sh: 42: [[: not found
te [[ są w ifach ktore dają wynik jeśli znajduje sie zawartość albo nie daja zadnego wyniku zeby nie zasyfiac komunikatami no such ile or directory
dodam też, że jeśli uruchamiam program poleceniem ./run.sh ~/Others program działa jak należy.
Ma ktoś propozycje jak rozwiązac mój problem, lub podpowiedz jak napisac taki skrypt bo zastosowanie kilku pętli for jest dla mnie glupim rozwiązaniem ale jedynym jakie znam.
Pozdrawiam TaZz
Offline
odpalac skrypt cronem przez basha lub usunac bashyzm jakim sa te [[ ]] poprzez zastapienie tego normalnym [] i odpowiednim przekierowaniem na /dev/null (na pierwszy rzut oka w tym wypadku niepotrzebnym)
Offline
ok, działa, teraz pytanie da rade zmusić pętle for do działania z podfolderami?
Offline
TaZz napisał(-a):
ok, działa, teraz pytanie da rade zmusić pętle for do działania z podfolderami?
ja bym po prostu użył finda
Offline
Alternatywnie można napisać sobie funkcję do rekurencyjnego sprawdzania podkatalogów i używać jej zamiast zwykłego for lub, jeśli to bash w wersji nie mniejszej niż 4.0, użyć bashyzmu:
shopt -s globstar #włącza domyślnie wyłączoną obsługę rekurencji w pętli for for i in /path/to/directory/**; do #zwróć uwagę na podwójną gwiazdkę anything done
Offline
Minio napisał(-a):
Alternatywnie można napisać sobie funkcję do rekurencyjnego sprawdzania podkatalogów i używać jej zamiast zwykłego for lub, jeśli to bash w wersji nie mniejszej niż 4.0, użyć bashyzmu:
Kod:
shopt -s globstar #włącza domyślnie wyłączoną obsługę rekurencji w pętli for for i in /path/to/directory/**; do #zwróć uwagę na podwójną gwiazdkę anything done
Próbowałem ale coś nie bardzo mi wychodziło.
azhag napisał(-a):
ja bym po prostu użył finda
czy w tym przypadku nie jestem ograniczony do tylko jednego rozszerzenia?
find Others/ -name *.mp3 -print -exec echo test {} ';'
napisałem sobie
musicext=`echo ";mp3;mp4;wav;acc;ogg;wma;pls" | sed s/';'/' *.'/g`
więc po prostu dodawał bym sobie rozszerzenia plikow audio i wywoływał bym je $musicext. a w tym FIND mi troche komplikuje sprawe
Offline
TaZz napisał(-a):
azhag napisał(-a):
ja bym po prostu użył finda
czy w tym przypadku nie jestem ograniczony do tylko jednego rozszerzenia?
Kod:
find Others/ -name *.mp3 -print -exec echo test {} ';'
bynajmniej:
find -regex REGEXP
Offline
azhag napisał(-a):
TaZz napisał(-a):
azhag napisał(-a):
ja bym po prostu użył finda
czy w tym przypadku nie jestem ograniczony do tylko jednego rozszerzenia?
Kod:
find Others/ -name *.mp3 -print -exec echo test {} ';'bynajmniej:
Kod:
find -regex REGEXP
to mi teraz 'dowaliłeś' nawet nie wiem jak to ugryźć :P
edit
imagesxp=".*.[JjPpgGTt][IinNpPSs][FfDdgG][Ff]" # jpg png gif psd tiff
dobrze myślę?
Ostatnio edytowany przez TaZz (2010-01-11 21:27:01)
Offline
Napisze Ci to, bo już widzę że popełniasz masę błędów:
MUSIC="mp3,ogg,oga,wmv" IMAGE="jpg,png,gif,bmp" find ~/path -name '*' | while read file; do EXTENSION=${FILE##*.} if echo "$MUSIC" |grep -i -q "$EXT"; then echo "$file jest plikiem muzycznym" elif echo "$IMAGE" |grep -i -q "$EXT"; then echo "$file jest plikiem graficznym" else echo "$file nie jest żadnym rozpoznawalnym rodzajem pliku" fi done
W ten sposób przy okazji uniewrażliwisz swój skrypt na wielkość liter w rozszerzeniu. Można go jeszcze dopracować poprzez dodanie funkcji sprawdzającej czy rozszerzenie jest na liście podanej jako argument (żeby nie klepać tych grepów w kółko), ale to już sobie zrobisz jak będziesz chciał.
Offline
Minio napisał(-a):
Napisze Ci to, bo już widzę że popełniasz masę błędów:
W ten sposób przy okazji uniewrażliwisz swój skrypt na wielkość liter w rozszerzeniu. Można go jeszcze dopracować poprzez dodanie funkcji sprawdzającej czy rozszerzenie jest na liście podanej jako argument (żeby nie klepać tych grepów w kółko), ale to już sobie zrobisz jak będziesz chciał.
człowiek uczy się na błędach a jak widać ja na prawde sie 'ucze' :D sądząc po ilości popełnianych błędów ostro.
Dzieki wszystkim za odpowiedź Pozdrawiam
Offline
TaZz napisał(-a):
azhag napisał(-a):
TaZz napisał(-a):
czy w tym przypadku nie jestem ograniczony do tylko jednego rozszerzenia?Kod:
find Others/ -name *.mp3 -print -exec echo test {} ';'bynajmniej:
Kod:
find -regex REGEXPto mi teraz 'dowaliłeś' nawet nie wiem jak to ugryźć :P
edit
imagesxp=".*.[JjPpgGTt][IinNpPSs][FfDdgG][Ff]" # jpg png gif psd tiff
dobrze myślę?
mozna tez prostacko:
find -name '*.mp3' -or -name '*.jpg'
PS polecam zabezpieczanie napisow majacych * pojedynczym apostrofem ... bo inaczej moze byc problem ...
Offline
bercik: ale potem i tak trzeba ifować, bo on chce na podstawie nazwy pliku przenieść go do odpowiedniego katalogu.
TaZz: ja tego skryptu nie sprawdzałem w praktyce. Jak widać wkradły się mi dwa błędy:
1. deklaruję zmienną pisaną małymi literami podczas gdy później odwołuję się do takiej samej pisanej dużymi literami (która oczywiście jest inną, niezadeklarowaną — czyli pustą — zmienną).
2. deklaruję zmienną EXTENSION podczas gdy potem używam wersji skróconej — EXT. Oczywiście ta też jest pusta.
Po poprawieniu tej dwójki zacznie działać.
Offline
bercik napisał(-a):
TaZz napisał(-a):
azhag napisał(-a):
bynajmniej:Kod:
find -regex REGEXPto mi teraz 'dowaliłeś' nawet nie wiem jak to ugryźć :P
edit
imagesxp=".*.[JjPpgGTt][IinNpPSs][FfDdgG][Ff]" # jpg png gif psd tiff
dobrze myślę?mozna tez prostacko:
Kod:
find -name '*.mp3' -or -name '*.jpg'PS polecam zabezpieczanie napisow majacych * pojedynczym apostrofem ... bo inaczej moze byc problem ...
Tego chciałem uniknąć mimo to dzięki za zainteresowanie.
@Minio wielkie dzięki.
Offline
Strony: 1