Fórum Root.cz
Hlavní témata => Software => Téma založeno: 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
-
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ů)...
-
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ěď
-
RTFM: man bash:
ls *.{mkv,avi}
-
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.
-
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)
-
>protože tam jaksi zůstávají i adresáře
find umi i -type f
-
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ě)
-
ls -1 | grep --regexp '.*\.avi' --regexp '.*\.mkv'
-
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 ...
-
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
-
Š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.
#!/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 '{}' \;
-
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?
-
$ 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.
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
-
$ 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)
...