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:
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
Gör jag så här istället
blir resultatet det mer väntade:
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
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