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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2010-01-11 15:20:17

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

[Bash] Skrypt do segregacji plikow i cron

witam zrobilem sobie skrypt ktory sprawdza zawartosc folderu (zmienna $1) i segreguje pliki do wybranych katalogów

Kod:

#!/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

Kod:

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

Kod:

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

 

#2  2010-01-11 16:26:34

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: [Bash] Skrypt do segregacji plikow i cron

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)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#3  2010-01-11 16:56:46

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: [Bash] Skrypt do segregacji plikow i cron

ok, działa, teraz pytanie da rade zmusić pętle for do działania z podfolderami?

Offline

 

#4  2010-01-11 17:25:23

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [Bash] Skrypt do segregacji plikow i cron

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


Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#5  2010-01-11 17:51:14

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [Bash] Skrypt do segregacji plikow i cron

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

Offline

 

#6  2010-01-11 19:32:29

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: [Bash] Skrypt do segregacji plikow i cron

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?

Kod:

find Others/ -name *.mp3 -print -exec echo test {} ';'

napisałem sobie

Kod:

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

 

#7  2010-01-11 20:31:00

  azhag - Admin łajza

azhag
Admin łajza
Skąd: Warszawa
Zarejestrowany: 2005-11-15

Re: [Bash] Skrypt do segregacji plikow i cron

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

Błogosławieni, którzy czynią FAQ.
opencaching :: debian sources.list :: coś jakby blog :: polski portal debiana :: linux user #403712

Offline

 

#8  2010-01-11 20:52:14

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: [Bash] Skrypt do segregacji plikow i cron

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

 

#9  2010-01-11 21:49:57

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [Bash] Skrypt do segregacji plikow i cron

Napisze Ci to, bo już widzę że popełniasz masę błędów:

Kod:

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

 

#10  2010-01-11 22:02:03

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: [Bash] Skrypt do segregacji plikow i cron

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

 

#11  2010-01-11 22:36:08

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: [Bash] Skrypt do segregacji plikow i cron

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 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ę?

mozna tez prostacko:

Kod:

find -name '*.mp3' -or -name '*.jpg'

PS polecam zabezpieczanie napisow majacych * pojedynczym apostrofem ... bo inaczej moze byc problem ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#12  2010-01-11 22:47:20

  Minio - Użyszkodnik

Minio
Użyszkodnik
Skąd: Poznań, Polska
Zarejestrowany: 2007-12-22
Serwis

Re: [Bash] Skrypt do segregacji plikow i cron

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

 

#13  2010-01-11 22:57:43

  TaZz - Użytkownik

TaZz
Użytkownik
Zarejestrowany: 2009-12-29

Re: [Bash] Skrypt do segregacji plikow i cron

bercik napisał(-a):

TaZz napisał(-a):

azhag napisał(-a):


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ę?

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)