Jak získat rekurzivně všechny názvy souborů a adresářů z adresáře

g52

Ahoj, neporadil by mi někdo jak dostat do cyklu všechny názvy souborů z daného adresáře (bez cesty) pro níže uvedenou verzi bash? Díky


Kód: [Vybrat]
for id in $(find ~/cesta -printf '%f\n')
do
   ...
done

Kód: [Vybrat]
Dostanu chybu:
find: -printf: unknown primary or operator

Kód: [Vybrat]
bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin21)
Copyright (C) 2007 Free Software Foundation, Inc.


mhi

  • ****
  • 406
    • Zobrazit profil
pouzivam kvuli mezeram a paznakum obvykle toto
find .  ... |while read fn ; do echo "zpracovavam soubor $fn" ; done

g52

Díky ale nějak to nešlape. Myslel jsi to takto?

Kód: [Vybrat]
VAR=""
find ~/cesta | while read fn
do
   VAR+=$fn
   echo $fn
done

echo $VAR

# echo $fn vypíše všechny položky ale proměnná VAR je prázdná

mhi

  • ****
  • 406
    • Zobrazit profil
nerozumim tomu ceho chcete dosahnout, v tom 'do' cyklu muzete soubory zpracovat. jestli to chcete do jedne promenne, jde dat

VAR=`find .`

a je to :). Jenze jakmile tam bude mezera nebo nejaky paznak, bude to bezcenna zmet znaku.

Pricitani obvykle delam VAR="$VAR $fn" nebo neco na ten zpusob. Operator += nepouzivam, mozna tam maji byt mezery, nevim.

g52

Blbě jsem to napsal. mělo to být pole ne string, ale to je jedno, pole se nenaplní a nevím proč.

Kód: [Vybrat]
ARR=()
find ~/cesta | while read fn
do
   ARR+=("$fn")
done
echo ${#ARR[@]} RESULT = 0



M Z

Proc tak slozite?  ;)
Kód: [Vybrat]
find ~/cesta  | while read line; do
blablabla "$line"
done

Tak to ti reknu naprosto presne, jsem kovany bashista a nedam na nej dopustit, jiz od starych dob se to dela takto:

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

python3 -m udelej.py
« Poslední změna: 14. 12. 2021, 20:51:04 od registrovany123 »

M Z

Pobavilo, ale ja to radeji resim vice old school:
Kód: [Vybrat]
find dir -print0 | awk  -f prog.awk  #a v prog.awk RS="\0"
Ale funguje to jen s gawk.

g52

Proc tak slozite?  ;)
Kód: [Vybrat]
find ~/cesta  | while read line; do
blablabla "$line"
done

Tohle vypadá že funguje, ale musím to pořádně otestovat, díky

g52

Tak to ti reknu naprosto presne, jsem kovany bashista a nedam na nej dopustit, jiz od starych dob se to dela takto:

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

python3 -m udelej.py

python mám rád, ale dělám aplikaci ve které potřebuji získat stisk kláves, což je problém, žádná knihovna která je nainstalovaná v systému kromě curses to neumí.

g52

Proc tak slozite?  ;)
Kód: [Vybrat]
find ~/cesta  | while read line; do
blablabla "$line"
done

Tohle vypadá že funguje, ale musím to pořádně otestovat, díky

Tak ne, radost byla předčasná, pokud naplním proměnou STR v tom cyklu, mimo cyklus je zase prázdná :(

Kód: [Vybrat]
find ~/cesta  | while read line; do
STR="$line"
done
echo $STR # proměnná je prázdná

k3dAR

  • *****
  • 2 248
  • porad nemam telo, ale uz mam hlavu... nobody
    • Zobrazit profil
    • E-mail
duvod proc ti to tvoje nejde je v podstate ten, ze zpracovavas vystup pres pipe, jehoz promene se ale nasledne ztraci ;-) bez pipe se to dela takto:
Kód: [Vybrat]
#!/bin/bash

ARR=()
while read fn
do
   ARR+=("$fn")
done < <(find ~/cesta)

echo ${#ARR[@]}

g52

duvod proc ti to tvoje nejde je v podstate ten, ze zpracovavas vystup pres pipe, jehoz promene se ale nasledne ztraci ;-) bez pipe se to dela takto:
Kód: [Vybrat]
#!/bin/bash

ARR=()
while read fn
do
   ARR+=("$fn")
done < <(find ~/cesta)

echo ${#ARR[@]}

Dostanu chybu
Kód: [Vybrat]
syntax error near unexpected token `<'
`done < <(find ~/data_dir)'

PS: pipe je ten použitý znak '|'?

M Z

Myslim ze tohle presmerovani < <() ve starsich verzich Bash nefungovalo. Zkus to s tmp souborem
Kód: [Vybrat]
find ~/data_dir >/tmp/$$.out
while read line; do
...
done </tmp/$$.out

GNU Parallel

Kód: [Vybrat]
#!/bin/bash
body(){
    echo $1
}
export -f body
find . | parallel -P 1 body {}