Portál AbcLinuxu, 5. května 2025 21:45

Dotaz: nefunkční test zda adresář obsahuje soubory ve formátu *.txt

7.3.2011 19:27 sisel.cz
nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Přečteno: 435×
Odpovědět | Admin

zdravím,

#!/bin/bash
CESTA=/home/download/fronta
if [ -e $CESTA/*.txt ]; then
     akce_1
  else
     akce_2
fi
můj skript by měl testovat přítomnost souborů s příponou .txt v adresáři a jakmile je objeví, provést s nimi akci_1.

Pokud je nenajde provést akci_2

vše funguje jak bych si představoval dokud je v adresáři žádný, nebo jeden soubor.txt. V okamžiku kdy dám do složky více souborů *.txt, zkončí skript s chybou "příliš mnoho argumentů" Poradíte mi prosím, jak skript poupravit aby vykonával "akci_1" i při výskytu více souborů s příponou .txt?

děkuji


Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.3.2011 20:17 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Odpovědět | | Sbalit | Link | Blokovat | Admin

Zdravim,

pokial potrebujes vykonat akciu aj v pripade, ze to nie je text. subor, tak mozes aj nasledovne:

#! /bin/bash
CESTA=/home/download/fronta

for FILE in "${CESTA}"/*
do
    if [[ "${FILE}" =~ \.txt$ ]]
    then
        akce_1
    else
        akce_2
    fi
done

Pokial ale nepotrebujes vykonat ziadnu akciu v pripade netextoveho suboru, tak potom takto:

#! /bin/bash

CESTA=/home/download/fronta

for FILE in "${CESTA}"/*.txt
do
    akce_1
done

V tvojom priklade to funguje ako ma. If cyklus je jednorazovy.

A este jedna poznamka, uisti sa, ze premenna CESTA obsahuje spravnu cestu.

7.3.2011 21:10 sisel.cz
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt

děkuji za odpověd..

Po vyzkoušení tvých skriptů, jsem si uvědomil, že jsem špatně formuloval dotaz :-(

Potřebuji, aby skript nahlížel do adresáře a kontroloval, zda tam není jeden či více souborů.txt. Pokud je najde, podmínka je splněna a spustí se další skript (akce_1)

pokud tam žádný txt soubor není (nehledně na to, jestli adresář obsahuje i jiné typy souborů), skript se ukončí (akce_2).

7.3.2011 21:36 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt

Takze pracujes vyhradne s textovymi subormi. Preto mozes pouzit for cyklus, teda druhy skript, co som ti dal. Ak totiz ziadny nenajde, tak nic nespravi a ak ziadny dalsi kod nenasleduje, tak nie je co vykonat a ukonci sa.

p.s.: Ak si nasiel riesenie, oznac to kliknutim na Riesenie. Nie ze by som sa citil o moc lepsie, ale je to hlavne prehladnejsie.

7.3.2011 23:37 Sten
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Odpovědět | | Sbalit | Link | Blokovat | Admin
Problém je v
[ -e $CESTA/*.txt ]
Pokud tam bude více souborů, shell je tam doplní a bude tam třeba
[ -e /home/download/fronta/prvni.txt /home/download/fronta/druhy.txt ]
což je příliš mnoho argumentů (jsou tam dva argumenty pro -e, ale smí tam být jen jeden).

Řešením je třeba použít find pro nalezení právě jednoho souboru (pokud existuje):
[ -n "$find $CESTA -name '*.txt' -print -quit)" ]
Nebo pokud to nemá hledat v podadresářích:
[ -n "$(find $CESTA -name '*.txt' -maxdepth 1 -print -quit)" ]
8.3.2011 06:57 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
nebo
if ls $CESTA/*.txt &>/dev/null; then
   akce_se_soubory
else
   akce_bez_souboru
fi
In Ada the typical infinite loop would normally be terminated by detonation.
8.3.2011 09:39 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Přesně tak. Mimochodem, co znamená to přesměrování ampersandu? To je zástupný znak pro všechny filedescriptory? Díky.
8.3.2011 09:57 JMP | skóre: 30
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
8.3.2011 15:56 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
AFAIK jen pro stdout a stderr.
In Ada the typical infinite loop would normally be terminated by detonation.
8.3.2011 21:05 sisel.cz
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Odpovědět | | Sbalit | Link | Blokovat | Admin
děkuji, přesně tohle jsem potřeboval.. Musím se ještě hodně učit, ale to já rád.

&>/dev/null zahodí standartní i chybový výstup, že ?

8.3.2011 21:22 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: nefunkční test zda adresář obsahuje soubory ve formátu *.txt
Konstrukce &>file je zkratka bashe pro >file 2>&1, tj. přesměrovat standardní i chybový výstup společně do souboru file.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.