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 24 Března 2013, 11:54:51

Název: if test " or ' [vyřešeno]
Přispěvatel: Uran 24 Března 2013, 11:54:51
Potrebuji vytvorit jednoduchy test.

Mel by ve slozce najit vsechny soubory mbp a porovnat jestli v druhe slozce existuje soubor stejneho jmena akorat s priponou txt. Adresarove struktury jsou stejne az na cesty v promenych $CYBOOK a $VYSTUP. Nazvy souboru a slozek mohou obsahovat mezery, "," a dalsi ne zcela bezproblematicke znaky.


Kód: [Vybrat]
#!/bin/bash
VSTUP="/home/"$USER"/Knihy/Precist/"
VYSTUP="/home/"$USER"/Knihy/Konverze/"
CYBOOK="/media/Cybook Gen3/eBooks/"

find  "$CYBOOK" -type f -iname '*.mbp'| while read F
do
if [ ! -e "`echo "${F%.*}" | sed s#"$CYBOOK"#"$VYSTUP"#`.txt" ]
then
echo "Mazu "$F""
#rm -rf "$F"
else
echo "Nemazu"
fi
done

Vysledek - pricemz  soubor /home/jakub/Knihy/Konverze/Zelazny, Roger - Ostrov mrtvých.txt existuje
Kód: [Vybrat]
.
Mazu /media/Cybook Gen3/eBooks/Zelazny, Roger - Ostrov mrtvých.mbp
.

Zkousel jsem skript na jednom zaznamu primitivne odladit, ale vysledek mi prijde v poradku, pritom vlastni skript nefunguje.

Nejak se asi spatne vyhodnoti if test, ale nemohu prijit na to proc.

Edit: jeste jsem zkusil vyzkouset test pro ruzne soubory a vyskedek je jiny nez bych ocekaval. Lisi se pouze ruznymi znaky v nazvu. Oba dva soubory txt existuji.

Kód: [Vybrat]
VSTUP="/home/"$USER"/Knihy/Precist/"
VYSTUP="/home/"$USER"/Knihy/Konverze/"
CYBOOK="/media/Cybook Gen3/eBooks/"
F="/media/Cybook Gen3/eBooks/Zelazny, Roger - Ostrov mrtvých.mbp"
if [ ! -e "`echo "${F%.*}" | sed s#"$CYBOOK"#"$VYSTUP"#`.txt" ]
then
echo "Mazu "$F""
#rm -rf "$F"
else
echo "Nemazu"
fi

Vysledek:

Mazu /media/Cybook Gen3/eBooks/Zelazny, Roger - Ostrov mrtvých.mbp


VSTUP="/home/"$USER"/Knihy/Precist/"
VYSTUP="/home/"$USER"/Knihy/Konverze/"
CYBOOK="/media/Cybook Gen3/eBooks/"
F="/media/Cybook Gen3/eBooks/Neomillnerova, Petra--Hry na bolest.mbp"
if [ ! -e "`echo "${F%.*}" | sed s#"$CYBOOK"#"$VYSTUP"#`.txt" ]
then
echo "Mazu "$F""
#rm -rf "$F"
else
echo "Nemazu"
fi

Vysledek:

Nemazu

Název: Re:if test " or '
Přispěvatel: pacholik 24 Března 2013, 14:54:53
mno... a opravdu se ty soubory jmenují naprosto stejně?
Název: Re:if test " or '
Přispěvatel: Uran 24 Března 2013, 15:56:31
mno... a opravdu se ty soubory jmenují naprosto stejně?

Tak ten u ktereho mi nefunguje ten test:

/media/Cybook Gen3/eBooks/Zelazny, Roger - Ostrov mrtvych.txt
/media/Cybook Gen3/eBooks/Zelazny, Roger - Ostrov mrtvých.mbp # ten testuji 1

/home/jakub/Knihy/Konverze/Zelazny, Roger - Ostrov mrtvych.txt  # v pripade, ze chybi smazat "ten testuji 1"

Ten u ktereho ten test funguje:

/media/Cybook Gen3/eBooks/Neomillnerova, Petra--Hry na bolest.txt
/media/Cybook Gen3/eBooks/Neomillnerova, Petra--Hry na bolest.mbp # ten testuji 2

/home/jakub/Knihy/Konverze/Konverze/Neomillnerova, Petra--Hry na bolest.txt # v pripade, ze chybi smazat "ten testuji 2"

Jinak nazvy jsou urcite stejne, protoze se generuji v ramci jineho konverzniho skritptu "mezi sebou".




Zkusil jsem podminku maximalne zjednodusit a pak mi to bez problemu funguje. Netusim kde delam chybu.

Kód: [Vybrat]
jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ cat ~/bin/test4
#!/bin/bash
find  ./cybook -type f -iname '*.mbp'| while read F
do
if [ ! -e "`echo "${F%.*}" | sed s#cybook#konverze#`.txt" ]
then
echo "Mazu "$F""
#rm -rf "$F"
else
echo "Nemazu "$F""
fi
done

jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ ls -R
.:
cybook  konverze

./cybook:
1.mbp  1.txt  2.mbp  2.txt

./konverze:
1.mbp  1.txt  2.mbp  2.txt
jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ test4
Nemazu ./cybook/2.mbp
Nemazu ./cybook/1.mbp


jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ cat ~/bin/test4
#!/bin/bash
find  ./cybook -type f -iname '*.mbp'| while read F
do
if [ ! -e "`echo "${F%.*}" | sed s#cybook#konverze#`.txt" ]
then
echo "Mazu "$F""
#rm -rf "$F"
else
echo "Nemazu "$F""
fi
done

jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ ls -R
.:
cybook  konverze

./cybook:
1.mbp  1.txt  2.mbp  2.txt

./konverze:
1.mbp  2.mbp  2.txt
jakub@jakub-TravelMate-5740:~/Prechodne/nnn$ test4
Nemazu ./cybook/2.mbp
Mazu ./cybook/1.mbp


Název: Re:if test " or '
Přispěvatel: pacholik 24 Března 2013, 16:09:57
vždyť se ti ty soubory liší v čárce nad y :P
Název: Re:if test " or '
Přispěvatel: Uran 24 Března 2013, 16:26:58
vždyť se ti ty soubory liší v čárce nad y :P

Uz mi to taky docvaklo. Me ten puvodni prevodni skript (ktery jsem tady neuvedl) nejak likviduje diakritiku, ale nevim proc. Takze zahada vyresena. Dik.

Jeste dotaz na zaver. Bude nasledujici test diky te * na konci expandovat na vsechny soubory s libovolnou priponou? Jde mi o to abych to pro kazdy typ souboru (doc, pdb, txt, ...) nemusel osetrovat zvlast.

if [ ! -e "`echo "${F%.*}" | sed s#"$CYBOOK"#"$VYSTUP"#`.*" ]

Název: Re:if test " or '
Přispěvatel: pacholik 24 Března 2013, 16:38:57
bude, ale pokud tam těch souborů bude víc tak ti to nebude fungovat (bash: [: příliš mnoho argumentů)
Název: Re:if test " or '
Přispěvatel: Uran 24 Března 2013, 16:49:00
bude, ale pokud tam těch souborů bude víc tak ti to nebude fungovat (bash: [: příliš mnoho argumentů)

Jasny jen je treba tu * hodit az za ty " -> if [ ! -e "`echo "${F%.*}" | sed s#"$CYBOOK"#"$VYSTUP"#`."* ]

Ja v ty slozce mam vzdy soubory s unikatnim nazvem (jen ruzne pripony) takze v pohode. Dekuji.
Snad je to vyreseno. Ted to du jeste zapracovat do toho monstr paskriptu.