Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: Uran 08 Listopadu 2011, 10:16:14
-
Potrebuji synchronizovat dve slozky (Konverze a Precist) a zaroven v pripade, ze v te druhe jsou soubory ktere nejsou v te prvni je (z te druhe ) smazat.
Cele to komplikuje fakt, ze se v ramci Konverze -> Precist se provadi kopirovani (symlinku) a zaroven konverze nekterych vybranych souboru na txt. Dalsi jobovka je ze pripona souboru muze mit promenou delku (tipicky 3 - 4 znaky).
Priklad:
/home/jakub/Knihy/Precist/aaa/Hetesa, Petr - Demoni jsou vecni.docx (symlink) -> /home/jakub/Knihy/Konverze/aaa/Hetesa, Petr - Demoni jsou vecni.txt (vysledny zkopirovany a prevedeny soubor)
Potrebuji nejak osetrit situaci (smazat soubor ve slozce Konverze) v pripade, ze neexistuje symlink ve slozce Precist.
Zkousel jsem tuto podminku, ale nejak se nedokazu vyporadat s tim, ze dochazi ke zmene pripony. A jelikoz muze byt pripona promena (doc, docx, rtf, odt, ...) tak uz nejak nevim jak na to.
F="/home/jakub/Knihy/Precist/aaa/Hetesa, Petr - Demoni jsou vecni.docx"
if [ -e "`echo "${F%.*}"* | sed 's#Precist#Konverze#'`" ]
then echo "Existuje v Konverze"
else echo "Neexistuje v Konverze"
fi
-
Tak jsem castecne pokrocil a skutecne mi to hleda ty soubory co jsou uz smazane jen to hazi spoustu chybovych hlasek. Nekde jsem asi zapomel uvozovky ci co. Poradi nekdo? Uz mi z toho trochu hrabe.
VSTUP="/home/"$USER"/Knihy/Precist/"
VYSTUP="/home/"$USER"/Knihy/Konverze/"
CYBOOK="/media/Cybook Gen3/eBooks"
find "$VYSTUP" -type f | while read F
do
G=`echo "${F%.*}" | sed "s#Konverze#Precist#"`
if [ ! -e "${G%.*}"* ]
then
echo "#############"
echo "$G"
echo "Soubor nexistuje"
echo "#############"
fi
done
bash: [: příliš mnoho argumentů
bash: [: příliš mnoho argumentů
bash: [: příliš mnoho argumentů
bash: [: příliš mnoho argumentů
bash: [: příliš mnoho argumentů
bash: [: /home/jakub/Knihy/Precist/Sága sedmi sluncí/Anderson K.J. - Sága sedmi sluncí 1 - Skrytá říše.doc: očekáván binární operátor
bash: [: /home/jakub/Knihy/Precist/Sága sedmi sluncí/Anderson K.J. - Sága sedmi sluncí 1 - Skrytá říše.doc: očekáván binární operátor
#############
/home/jakub/Knihy/Precist/Odkaz na Effinger M. A/Effinger_Marid_Audran-1-Kdyz_pritazlivost_selze
Soubor nexistuje
#############
#############
/home/jakub/Knihy/Precist/Odkaz na Effinger M. A/Effinger_Marid_Audran-2-Ohen_ve_slunci
Soubor nexistuje
#############
#############
/home/jakub/Knihy/Precist/Odkaz na Effinger M. A/Effinger_Marid_Audran-3-Polibek_vyhnanstvi.
Soubor nexistuje
#############
#############
/home/jakub/Knihy/Precist/Odkaz na Merle, Robert - Malevil
Soubor nexistuje
#############
bash: [: příliš mnoho argumentů
bash: [: příliš mnoho argumentů
V priloze vypisy (find z adresare "$VSTUP" a "$VYSTUP")
[attachment deleted by admin]
-
Uz asi chapu to prislovi "Rano moud...." mel jsem se na to vyspat. Reseni je trivialni. Omylem jsem dvakrat osekal soubory o pripony a u tech ktere v nazvu obsahovali dve .. se to projevilo. Nalsedujici podminka uz funguje.
Jeste na zaver bych se rad zeptal jak to prepsat abych nemusel pouzivat dve promene tedy zapracovat ty substituce a expanze primo do if [ ]?
find "$VYSTUP" -type f | while read F
do
G=`echo "${F%.*}" | sed "s#Konverze#Precist#"`
if [ ! -e "$G"* ]
then
echo "#############"
echo "$G"*
echo "Soubor nexistuje"
echo "#############"
fi
done
-
G=`echo "${F%.*}" | sed "s#Konverze#Precist#"`
tady je problém, že ti sed může změnit ten řetězec i v názvu souboru (pokud se tam objeví)
if [ ! -e "$G"* ]
tady je probém, že "$G"* ti může expandovat na více souborů. Pak to háže chybu. Nebo může expandovat na řetězec '$G*'.
-
Dekuji za pripominku ohledne problemu pri expanzi. S ohledem na to, ze se jedna o nazvy knih a mam je pouze v jednom formatu to vadit nebude.
Jediny zadrhel by mohl nastat v pripade, ze by ve stejne slozce byla slozka se stejnym nazvem jako ma soubor bez pripony -> "bash: [: příliš mnoho argumentů". Coz se asi take nestane.
Takze suma sumarum pro me ucely tj. synchronizaci a konverzi knih to postacuje.
Dekuji za radu a z me strany bych to povazoval za uzavrene.