Fórum Root.cz

Hlavní témata => Software => Téma založeno: Michal Švarc 29. 01. 2011, 13:15:09

Název: Skripty a mezery v názvech souborů
Přispěvatel: 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))
Kód: [Vybrat]
#!/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
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Lukas 29. 01. 2011, 13:30:43
Nedelat mezery v nazvech ? :)

Ne vazne: man bash
a hledej IFS
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Michal Švarc 29. 01. 2011, 14:29:48
 ;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.
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Kit 29. 01. 2011, 19:05:29

Kód: [Vybrat]
#!/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.
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Kit 29. 01. 2011, 19:14:00
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čí.
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Michal Švarc 30. 01. 2011, 00:13:06
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 ...
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Lukas 30. 01. 2011, 00:26:13
No ja bych spis tipnul treba \n :)
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Logik 30. 01. 2011, 03:47:41
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.
Název: Re: Sh scripty a mezery v názvech souborů
Přispěvatel: Kit 30. 01. 2011, 08:58:05
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.
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: Michal Švarc 10. 02. 2011, 01:03:56
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:
Kód: [Vybrat]
#!/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
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: pepazdepa 10. 02. 2011, 08:38:15
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.
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: Michal Švarc 10. 02. 2011, 10:42:18
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
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: none 10. 02. 2011, 11:30:00
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.
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: pepazdepa 10. 02. 2011, 12:12:11

Kód: [Vybrat]
#!/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!
Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: hawran diskuse 10. 02. 2011, 13:24:12
$ ls -l
Kód: [Vybrat]
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:
Kód: [Vybrat]
#!/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:
Kód: [Vybrat]
#!/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

Název: Re: Skripty a mezery v názvech souborů
Přispěvatel: Mmad 10. 02. 2011, 20:35:05
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í...