Fórum Root.cz

Hlavní témata => Software => Téma založeno: Michal Švarc 03. 02. 2011, 00:37:13

Název: Jak nalézt soubory v adresáři
Přispěvatel: Michal Švarc 03. 02. 2011, 00:37:13
pro jednu příponu to není problém (ls *.mkv; find *.mkv; find | grep mkv$ )

ls *.mkv *.avi (pokud není alespoň jeden soubor od každé přípony - vypíše nalezené a chybu)
find *.mkv *.avi (stejně jako u ls)

zajímá mě, jak nechat vypsat v jednom seznamu, soubory avi a mkv, aniž by to vypsalo chybu
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: Logik 03. 02. 2011, 01:51:23
Co použít příkaz man? Ne neslouží k hledání souborů, ale odpověď na svoji otázku bys tam našel, kdybys  sis přečet aspoň ty příkazy, nad kterejmas uvažoval...
find -name \*.mkv -or -name \*.avi

Další možnost je regex
 ls | egrep '(\.mkv$)|(\.py$)'

btw. to
find *.mkv
i
find | grep mkv$
je dosti blbina - teda ono to nějak funguje, ale úplně jinak, než pravděpodobně myslíš, i když je  výsledek takovej, jakej čekáš (proto to taky selže u dvou argumentů)...
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: Michal Švarc 03. 02. 2011, 02:14:17
víš, man používám, a '-name' jsem i našel, ale nějak jsem přehlédl konstrukci typu '-or -name'

tak či tak, díky za odpověď
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: pet 03. 02. 2011, 07:47:03
RTFM: man bash:
ls *.{mkv,avi}
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: Tomas M 03. 02. 2011, 08:50:38
Pro 'pet': pokud bude pocet souboru v adresari vyhovujicich podmince enormni (treba desitky tisic), pak prikaz typu ls *.{mkv,avi} nebude fungovat, protoze shell expansion se provede jeste pred spustenim programu ls, a enormni mnozstvi argumentu dela problem.

Na tohle je bezpecnejsi ten program find.
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: Michal Švarc 03. 02. 2011, 10:20:35
Tak jo, děkuji všem za rady.

Šlo mi o to, dosadit vhodný příkaz (z manuálů se těžko hledá vhodný, když některé příkazy vůbec neznáte) do scriptu (http://forum.root.cz/index.php?topic=1610.0) tak aby nemusel být pro každou příponu nový cyklus.

Díky tomu jsem zjistil, že find i ls a egrep asi ne, protože tam jaksi zůstávají i adresáře (nehledě na to, že druhý z uvedených z jakéhosi důvodu vypisuje i soubory typu .mkv.jpg atp.)

Jediný funkční tedy zůstává ls *.{mkv,avi}, ještě že nemám tisíce souborů v jednom adresáři (mám max. 500)
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: xKiv 03. 02. 2011, 16:50:49
>protože tam jaksi zůstávají i adresáře
find umi i -type f
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: Michal Švarc 04. 02. 2011, 00:18:12
No dobrá, funguje i toto:
find -type f -name \*.avi -o -name \*.mkv
(jen člověk nesmí zapomínat na to že to hledá i rekurzivně)
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: iko 04. 02. 2011, 08:17:19
ls -1 | grep --regexp '.*\.avi' --regexp '.*\.mkv'
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: hawran diskuse 04. 02. 2011, 10:33:20
Kód: [Vybrat]
ls -1 *.mkv *.avi 2>/dev/null
PS: pro hodně velký počet souborů to nebude fungovat (problém s délkou parametrů), tam pak asi ten find ...
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: pepazdepa 04. 02. 2011, 11:15:26
pro jednu příponu to není problém (ls *.mkv; find *.mkv; find | grep mkv$ )

ls *.mkv *.avi (pokud není alespoň jeden soubor od každé přípony - vypíše nalezené a chybu)
find *.mkv *.avi (stejně jako u ls)

zajímá mě, jak nechat vypsat v jednom seznamu, soubory avi a mkv, aniž by to vypsalo chybu

lameri! proc grep!????

$ ls *.+(mkv|avi)
kokot1.mkv kokot2.avi
$ echo $SHELL
/usr/local/bin/ksh

$ ls *.+(mkv|avi)
kokot1.mkv  kokot2.avi
$ echo $SHELL
/bin/bash
Název: Re: Jak nalézt soubory v adresáři (2 a více přípon)
Přispěvatel: Kit 04. 02. 2011, 12:03:21
Šlo mi o to, dosadit vhodný příkaz (z manuálů se těžko hledá vhodný, když některé příkazy vůbec neznáte) do scriptu (http://forum.root.cz/index.php?topic=1610.0) tak aby nemusel být pro každou příponu nový cyklus.

Kód: [Vybrat]
#!/bin/bash

find "$1" -maxdepth 1 -name \*.mkv -o -name \*.avi \
      -exec vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black \
            -H 100 -c 4 -i 250s -j -n 24 '{}' \;
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: none 04. 02. 2011, 18:41:34
No dobrá, funguje i toto:
find -type f -name \*.avi -o -name \*.mkv
(jen člověk nesmí zapomínat na to že to hledá i rekurzivně)
Clovece na co je ti ten man? Co zkusit: -maxdepth 0?
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: Michal Švarc 04. 02. 2011, 23:19:32
$ ls *.+(mkv|avi)
bash: chyba syntaxe poblíž neočekávaného tokenu „(“

Clovece na co je ti ten man? Co zkusit: -maxdepth 0?
A k čemu je tobě? Jak už psal před tebou kit, musí tam být -maxdepth 1. S nulou to nenajde nic.

Kód: [Vybrat]
find "$1" -maxdepth 1 -name \*.mkv -o -name \*.avi \
      -exec vcs -O bg_sign=black -O bg_contact=silver -O fg_heading=black \
            -H 100 -c 4 -i 250s -j -n 24 '{}' \;
Díky
Název: Re: Jak nalézt soubory v adresáři
Přispěvatel: moen 17. 03. 2011, 11:26:18
Kód: [Vybrat]
$ ls *.+(mkv|avi)
1.avi  2.mkv
$ echo $SHELL
/bin/bash
$ bash --version
GNU bash, verze 4.1.5(1)-release (i486-pc-linux-gnu)
...