Fórum Root.cz
Hlavní témata => Software => Téma založeno: Michal Švarc 29. 01. 2011, 13:15:09
-
Co bych měl udělat, když mám mezery v názvech souborů a chci s nimi pracovat v shelu? ( vcs (http://forum.root.cz/index.php?topic=1587.new#new))
#!/bin/bash
cd $1 #načte adresář
for fileMkv in "*.mkv"
do
if [ -e $fileMkv ]
then
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 $fileMkv
else echo "soubor s příponou mkv neexistuje"
fi
done
takhle to pracuje s jedním souborem s mezerami, ale když jich tam je víc, tak se nechytá;
když nejsou s mezerami tak stačí tato část 'for fileMkv in "*.mkv"' bez uvozovek
-
Nedelat mezery v nazvech ? :)
Ne vazne: man bash
a hledej IFS
-
;D To je pravda, ale když je od někoho dostaneš, tak i kdybys je chtěl jen přejmenovat, tak se hodí skript.
Díky přesně to (http://mindspill.net/computing/linux-notes/using-the-bash-ifs-variable-to-make-for-loops-split-with-non-whitespace-characters.html) jsem potřeboval.
-
#!/bin/bash
cd "$1" #tady jsou ty uvozovky také potřeba
for fileMkv in *.mkv # a tady by neměly být, protože * potřebujeme expandovat
do
if [ -e "$fileMkv" ] # Tady ty uvozovky patří, jinak podmínka nemusí fungovat kvůli počtu parametrů
then
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 "$fileMkv" # Tady jsou také nutné
else echo "soubor s příponou mkv neexistuje"
fi
done
Prostě je nutné dávat uvozovky tam kde je potřeba. Hlavně kolem názvu použité proměnné. A to i preventivně, i když soubory s mezerami v názvu nepoužívám.
-
Ještě k modifikaci IFS: Výměna mezery za čárku NENÍ řešení. Vždycky je možné narazit na soubor, který má čárku v názvu a budeš tam kde jsi byl předtím.
Správným řešením je používání uvozovek. Vím, že je to opruz, ale zvykl jsem si je používat vždy, když zpracovávám jakékoli informace dodávané do skriptu zvenčí.
-
Ještě k modifikaci IFS: Výměna mezery za čárku NENÍ řešení. Vždycky je možné narazit na soubor, který má čárku v názvu a budeš tam kde jsi byl předtím.
Správným řešením je používání uvozovek. Vím, že je to opruz, ale zvykl jsem si je používat vždy, když zpracovávám jakékoli informace dodávané do skriptu zvenčí.
Upřímně, také radši používám uvozovky, než funkce (když to jde) - díky, zkusím to, uau funguje to, opravdu děkuji.
Jinak, jestli jsem správně pochopil IFS, tak se nemusí měnit za čárku, ale jde to obměnit za cokoliv, a určitě se dá najít znak, který se tam vyskytovat nemá - sám bych tipnul uvozovky, nebo lomítko ...
-
No ja bych spis tipnul treba \n :)
-
No tak zrovna jak uvozovky, tak i \n se v názvu souboru použít může. Jediný opravdu zakázaný znak je null char a lomítko.
-
Jinak, jestli jsem správně pochopil IFS, tak se nemusí měnit za čárku, ale jde to obměnit za cokoliv, a určitě se dá najít znak, který se tam vyskytovat nemá - sám bych tipnul uvozovky, nebo lomítko ...
Proměnná IFS má jiný účel: Je to oddělovač polí, který se dá využít např. v příkazu read z nějakého souboru CSV nebo TSV. V tom případě je vhodné do ní dát čárku resp. tabulátor. Pro čtení /etc/passwd se zase hodí dvojtečka.
-
A jsem tu zas. Udělal jsem uvedený script 4x pro různé přípony, načež si říkám, musí to přece jít zjednodušit.
Přez různé pokusy (http://forum.root.cz/index.php?topic=1644.0), jsem se dostal do takovéhle fáze:
#!/bin/bash
breakFile=""
falseHlaska="Soubor se nepodařilo opravit"
for videoFile in `ls *.mkv *.mp4 *.avi *.wmv 2>/dev/null`
do
if [ -e "$1$videoFile" ]
then
if [ "$breakFile" != "" ]
then
echo ""; echo "$falseHlaska"
breakFile=""
fi
echo "videosoubor ok: '$1$videoFile'"
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 "$1$videoFile"
else echo -n "k opravě: $videoFile ;"
if [ "$breakFile" = "" ]
then breakFile="$videoFile"
else breakFile="$breakFile $videoFile"
fi
if [ -e "$1$breakFile" ]
then
echo ""
echo "opravený soubor: $breakFile"
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 "$1$breakFile"
breakFile=""
fi
fi
done
if [ "$breakFile" != "" ]
then
echo "";echo "$falseHlaska"
breakFile=""
fi
což sice funguje i s mezerami, ale nedokážu tím vyřešit situaci, kdy jich je víc vedle sebe
-
Co bych měl udělat, když mám mezery v názvech souborů
existuji program detox, ktery tyhle k0k0t1ny prevadi na "normalni" nazvy souboru.
-
Co bych měl udělat, když mám mezery v názvech souborů
existuji program detox, ktery tyhle k0k0t1ny prevadi na "normalni" nazvy souboru.
Ano, jedna z možností, je převod jmen souborů, ale netvrď mi, že to jinak nejde
-
Ahoj!
Neni to pokus o flame.
Reknete mi nekdo, proc bychom v dnesni dobe nemeli/nemohli pouzivat v nazvech souboru ci adresaru diakritiku. Osobne ji nepouzivam, ale nevidim v tom nic tak spatneho, aby se to melo odsuzovat. Je tady nejaky realny technicky problem, kvuli kteremu by se nemela diakritika pouzivat? Zatim to na me pusobi tak, ze je to kvuli pohodlnosti uzivatele. Pokud chce escapovat mezery v shellu nebo vypisovat slozite nazvy s diakritikou apod. necht to tak dela. Technicky to neni problem a kdo rika ze ano at uvede v cem.
-
#!/bin/bash
breakFile=""
falseHlaska="Soubor se nepodařilo opravit"
for videoFile in `ls *.mkv *.mp4 *.avi *.wmv 2>/dev/null`
do
if [ -e "$1$videoFile" ]
then
if [ "$breakFile" != "" ]
then
echo ""; echo "$falseHlaska"
breakFile=""
fi
echo "videosoubor ok: '$1$videoFile'"
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 "$1$videoFile"
else echo -n "k opravě: $videoFile ;"
if [ "$breakFile" = "" ]
then breakFile="$videoFile"
else breakFile="$breakFile $videoFile"
fi
if [ -e "$1$breakFile" ]
then
echo ""
echo "opravený soubor: $breakFile"
vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black -H 100 -c 4 -i 250s -j -n 24 "$1$breakFile"
breakFile=""
fi
fi
done
if [ "$breakFile" != "" ]
then
echo "";echo "$falseHlaska"
breakFile=""
fi
OMG, camelcase!
-
$ ls -l
total 8
-rw-r--r-- 1 .. 0 2011-02-04 10:34 00 00 00 00 00.avi
-rw-r--r-- 1 .. 0 2011-02-10 10:53 00 01 02.avi
-rw-r--r-- 1 .. 0 2011-02-04 10:30 01 00.avi
-rw-r--r-- 1 .. 0 2011-02-04 10:30 01.avi
-rw-r--r-- 1 .. 0 2011-02-10 11:56 ěšč řžý áíé.avi
-rw-r--r-- 1 .. 0 2011-02-10 11:56 ěščřžýáíé.avi
-rwxr--r-- 1 .. 150 2011-02-10 13:18 filesinloop.sh
-rw-r--r-- 1 .. 0 2011-02-04 10:30 prvni.avi
-rwxr--r-- 1 .. 235 2011-02-10 13:15 to_do.sh
..:/.../110204 $
filesinloop.sh:
#!/usr/bin/env bash
find . -type f \( -name '*.mkv' -o -name '*.mp4' -o -name '*.avi' -o -name '*.wmv' \) -print0|xargs -0 -I % ./to_do.sh %
exit 0
to_do.sh:
#!/usr/bin/env bash
echo -e "\nTODO: '$1'"
ls -l "$1" || { echo -e "\nls -l: !!! ERROR !!!\n"; exit 1; }
file "$1" || { echo -e "\nfile: !!! ERROR !!!\n"; exit 2; }
stat "$1" || { echo -e "\nstat: !!! ERROR !!!\n"; exit 3; }
exit 0
-
Už jste zkoušeli diakritiku spolu s překódováváním češtiny na webových serverech? Za ty problémy mi diakritika nestojí...