Skripty a mezery v názvech souborů

Skripty a mezery v názvech souborů
« kdy: 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)
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
« Poslední změna: 30. 01. 2011, 21:49:33 od Petr Krčmář »


Lukas

Re: Sh scripty a mezery v názvech souborů
« Odpověď #1 kdy: 29. 01. 2011, 13:30:43 »
Nedelat mezery v nazvech ? :)

Ne vazne: man bash
a hledej IFS

Re: Sh scripty a mezery v názvech souborů
« Odpověď #2 kdy: 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 jsem potřeboval.

Kit

Re: Sh scripty a mezery v názvech souborů
« Odpověď #3 kdy: 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.

Kit

Re: Sh scripty a mezery v názvech souborů
« Odpověď #4 kdy: 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čí.


Re: Sh scripty a mezery v názvech souborů
« Odpověď #5 kdy: 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 ...
« Poslední změna: 30. 01. 2011, 00:21:18 od Michal Švarc »

Lukas

Re: Sh scripty a mezery v názvech souborů
« Odpověď #6 kdy: 30. 01. 2011, 00:26:13 »
No ja bych spis tipnul treba \n :)

Logik

  • *****
  • 1 047
    • Zobrazit profil
    • E-mail
Re: Sh scripty a mezery v názvech souborů
« Odpověď #7 kdy: 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.

Kit

Re: Sh scripty a mezery v názvech souborů
« Odpověď #8 kdy: 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.

Re: Skripty a mezery v názvech souborů
« Odpověď #9 kdy: 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, 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
« Poslední změna: 10. 02. 2011, 01:44:35 od Michal Švarc »

pepazdepa

Re: Skripty a mezery v názvech souborů
« Odpověď #10 kdy: 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.

Re: Skripty a mezery v názvech souborů
« Odpověď #11 kdy: 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

none

Re: Skripty a mezery v názvech souborů
« Odpověď #12 kdy: 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.

pepazdepa

Re: Skripty a mezery v názvech souborů
« Odpověď #13 kdy: 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!

Re: Skripty a mezery v názvech souborů
« Odpověď #14 kdy: 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