Portál AbcLinuxu, 4. května 2025 14:18
Řešení dotazu:
for i in $(seq 1 1000); do .... [ -f "Screen-$i.jpg" ] && .... ....
$ cd /dev/shm/ $ mkdir e $ cd e $ touch 120.jpg $ touch 12.jpg $ touch 2.jpg $ ls 12.jpg 120.jpg 2.jpg $ ls|sort -h 2.jpg 12.jpg 120.jpg $
$ touch 0 1 10 11 12 1223 1224 13 14 2 3 $ ls 0 1 10 11 12 1223 1224 13 14 2 3 $ ls|sort -g | xargs 0 1 2 3 10 11 12 13 14 1223 1224
Pokud jsou čísla v názvech souborů dostatečně „hustá“, tedy žádná nejsou vynechaná nebo je vynechaných rozumně málo:
for ((i = 1; i <= 1000; ++i)); do f="Screen-${i}.jpg" [[ -f "$f" ]] && echo "Do something with ${f}!" done
Pokud jsou čísla v názvech souborů řídká a testovat existenci všech možných názvů souborů nemá smysl (a/nebo trvá 5000 let):
declare -ai files for f in *.jpg; do f="${f%.jpg}" f="${f#Screen-}" ((++files[f])) done for i in "${!files[@]}"; do f="Screen-${i}.jpg" echo "Do something with ${f}!" done unset filesVýše uvedené využívá faktu, že (také) indexovaná pole v Bashi jsou řídká a při expanzi jsou implicitně setříděná podle indexů.
Screen-<cislo>.jpg
, tak separator je "-
" a zajima me druhy sloupec.
vychozi stav:
$ ls -1 Screen-0.jpg Screen-10.jpg Screen-11.jpg Screen-1223.jpg Screen-1224.jpg Screen-12.jpg Screen-13.jpg Screen-14.jpg Screen-1.jpg Screen-2.jpg Screen-3.jpgsort:
$ ls -1 | sort -t - -nk2 Screen-0.jpg Screen-1.jpg Screen-2.jpg Screen-3.jpg Screen-10.jpg Screen-11.jpg Screen-12.jpg Screen-13.jpg Screen-14.jpg Screen-1223.jpg Screen-1224.jpg
todlecto dělání s ls už andrej jednou komentoval hele zdroj :O ;D
Nikdy neparsuj výstup z
ls
. Je to
- nechvalně známý antipattern,
- náchylné ke spoustě zbytečných chyb,
- naprosto a totálně a kolosálně zbytečné.
takže asi jako tak :D ;D
tssss todlecto je na domáckám moc praktický a ikdyby to jakoby byl domácák nóóó tak teďko se má jako aspoň z čeho učit :D ;D
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.