ls till sträng

Här diskuteras programmering och utveckling
Användarvisningsbild
zero gravity
Wikiadmin
Inlägg: 2504
Blev medlem: 15 apr 2006, 15:37
OS: Arch Linux
Ort: Bohuslän
Kontakt:

ls till sträng

Inlägg 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?
Senast redigerad av 1 zero gravity, redigerad totalt 28 gånger.
Abusus non tollit usum
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

SV: ls till sträng

Inlägg 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.
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

SV: ls till sträng

Inlägg 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)
Senast redigerad av 1 mcNisse, redigerad totalt 28 gånger.
KDE 4.5 SC är ute i det fria!!! Tjoho

Stagnation is good for nobody - after all if you don't progress you end up with gnome
Användarvisningsbild
zero gravity
Wikiadmin
Inlägg: 2504
Blev medlem: 15 apr 2006, 15:37
OS: Arch Linux
Ort: Bohuslän
Kontakt:

SV: ls till sträng

Inlägg av zero gravity »

Tog en titt på arrays och de funkade fin fint.

exempelvis:

LS=( `ls` )
echo ${LS[5]}
Abusus non tollit usum
Lars
Inlägg: 6191
Blev medlem: 14 jan 2007, 19:31
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Ort: Stockholm

SV: ls till sträng

Inlägg 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
Användarvisningsbild
mcNisse
Inlägg: 5211
Blev medlem: 06 feb 2007, 20:51
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg 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?
KDE 4.5 SC är ute i det fria!!! Tjoho

Stagnation is good for nobody - after all if you don't progress you end up with gnome
Användarvisningsbild
zero gravity
Wikiadmin
Inlägg: 2504
Blev medlem: 15 apr 2006, 15:37
OS: Arch Linux
Ort: Bohuslän
Kontakt:

SV: ls till sträng

Inlägg av zero gravity »

Markerade tråden som olöst igen då jag antagligen kommer få mer problem :)
Abusus non tollit usum
Användarvisningsbild
zero gravity
Wikiadmin
Inlägg: 2504
Blev medlem: 15 apr 2006, 15:37
OS: Arch Linux
Ort: Bohuslän
Kontakt:

SV: ls till sträng

Inlägg 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?
Abusus non tollit usum
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: ls till sträng

Inlägg 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.
Användarvisningsbild
zero gravity
Wikiadmin
Inlägg: 2504
Blev medlem: 15 apr 2006, 15:37
OS: Arch Linux
Ort: Bohuslän
Kontakt:

SV: ls till sträng

Inlägg 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
Senast redigerad av 1 zero gravity, redigerad totalt 29 gånger.
Abusus non tollit usum
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: ls till sträng

Inlägg 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
Senast redigerad av 1 Konservburk, redigerad totalt 29 gånger.
Skriv svar

Återgå till "Programmering och webbdesign"