Sida 1 av 1

ls till sträng

Postat: 28 nov 2007, 11:40
av zero gravity
Håller på att göra ett shell script i bash.
Skulle behöva spara datan från ls till en sträng som jag sedan kan arbeta med. Bla vill jag kunna ta valritt filnamn ur strängen och arbeta med det.
Hur sparar jag outputen från ls i en sträng?
Hur kan jag plocka ut ett specifikt filnamn (t.ex. 3e namnet i strängen) ur sträng?

SV: ls till sträng

Postat: 28 nov 2007, 12:04
av Lars
Om du vill gå igenom hela listan steg för steg så fungerar ju detta:

Kod: Markera allt

for filename in *; do
  echo $a
done
men annars kan du kika på arrays, se man bash.

SV: ls till sträng

Postat: 28 nov 2007, 12:12
av mcNisse
Har du filer som innehåller mellanslag är du ute på halt vatten med lösningen ovan... Jag tror att arrayer kan lösa ditt problem, om du har mellanslag i namn. Men jag har inte använt dem... tyvär.

Edit: Lösning för att hantera filnamn med mellanslag: filnamn=$(ls -Q)

SV: ls till sträng

Postat: 28 nov 2007, 13:10
av zero gravity
Tog en titt på arrays och de funkade fin fint.

exempelvis:

LS=( `ls` )
echo ${LS[5]}

SV: ls till sträng

Postat: 28 nov 2007, 13:12
av Lars
Min lösning ovan fungerar faktiskt utmärkt med mellanslag i namnen, prova ;)

Så här kan man göra med en array:

Kod: Markera allt

#!/bin/bash

fillista=("*")
echo ${fillista[0]}
echo ${fillista[1]}
for filnamn in ${fillista[*]}; do
  echo $filnamn
done

SV: ls till sträng [LÖST]

Postat: 28 nov 2007, 13:40
av mcNisse
Där ser man. Kul att lära sig något nytt :)

Tyvär fungerar inte Zeros lösning för filer med mellanslag...

Jag får heller inte lösningen med ls -Q att furgera...

Så här gör jag

Kod: Markera allt

mkdir slask
cd slask
touch foo bar "foo bar"
f=$(ls -Q)
for d in ${f[*]};do echo $d;done
och får denna lista

Kod: Markera allt

"bar"
"foo"
"foo
bar"
"foo"
"foo
bar"
Gör jag så här istället

Kod: Markera allt

for d in $f; do echo $d; done
blir resultatet det mer väntade:

Kod: Markera allt

"bar"
"foo"
"foo
bar"
Och skapas f som du beskriver blir resultatet helt rätt. Vad är det som gör att man får så vansinnigt många rader i mitt första fall?

SV: ls till sträng

Postat: 28 nov 2007, 18:13
av zero gravity
Markerade tråden som olöst igen då jag antagligen kommer få mer problem :)

SV: ls till sträng

Postat: 29 nov 2007, 00:02
av zero gravity
Efter mkt om och men så börjar mitt script bli klart. Har dock ett problem, tabbar i echo.

Kod: Markera allt

#!/bin/bash

fillista=("*")
for filnamn in ${fillista[*]}; do
  echo -e "$filnamn \t ettord"
done
Skulle $filnamn vara väldigt långt så hamnar tabben fel. Finns det något sätt att ändra \t längden?

SV: ls till sträng

Postat: 29 nov 2007, 00:25
av Konservburk
zero gravity skrev: Skulle $filnamn vara väldigt långt så hamnar tabben fel. Finns det något sätt att ändra \t längden?
Använd printf istället för echo...

Kod: Markera allt

fillista=("*")
for filnamn in ${fillista[*]}; do
   test ${tablength-0} -lt ${#filnamn} && tablength=${#filnamn}
done
for filnamn in ${fillista[*]}; do
  printf "%-*s   %s\n" $tablength "$filnamn" "ettord"
done
Den första loopen tar bara reda på hur långt det längsta filnamnet är.
Du kan skippa den och välja ett eget värde  på $tablength om du vill.

SV: ls till sträng

Postat: 29 nov 2007, 10:33
av zero gravity
Vilket underbart kommando  :D

Finns bara ett problem:

Innehåller $filnamn åäö så räknas dessa bort. Hur fixar jag detta?

Ex.

Kod: Markera allt

"%-20s     %s\n" "öåärnen" "ord1" && printf "%-20s     %s\n" "oaarnen" "ord1"
öåärnen               ord1
oaarnen                  ord1

SV: ls till sträng

Postat: 29 nov 2007, 14:03
av Konservburk
zero gravity skrev:

Kod: Markera allt

"%-20s     %s\n" "öåärnen" "ord1" && printf "%-20s     %s\n" "oaarnen" "ord1"
öåärnen               ord1
oaarnen                  ord1
Det låter som att printf inte är kompis med utf-8.
Testa om det är det som är problemet mha iconv...

Kod: Markera allt

for i in *; do
   i="$(echo $i | iconv -f UTF-8 -t ISO-8859-1)"
   printf "%-20s     %s\n" "$i" "ord1" | iconv -f ISO-8859-1 -t UTF-8
done
EDIT:
Det här skulle också kunna fungera:

Kod: Markera allt

export LC_ALL=C
for i in *; do
   printf "%-*s     %s\n" $((${#i}+15)) "$i" "ord1"
done