Re: Dateinamen kürzen

2006-08-18 Diskussionsfäden Michelle Konzack
Am 2006-06-29 23:13:15, schrieb Frank Terbeck:
 for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

Uff... - Das verändert die ctime und mtime!

Wie währe es mit:

find -type f -name *.done -exec rename s/\.done// {}';'

Greetings
Michelle Konzack
Systemadministrator
Tamay Dogan Network
Debian GNU/Linux Consultant


-- 
Linux-User #280138 with the Linux Counter, http://counter.li.org/
# Debian GNU/Linux Consultant #
Michelle Konzack   Apt. 917  ICQ #328449886
   50, rue de Soultz MSM LinuxMichi
0033/6/6192519367100 Strasbourg/France   IRC #Debian (irc.icq.com)


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-08-18 Diskussionsfäden Jörg Sommer
Hallo Michelle,

Michelle Konzack [EMAIL PROTECTED] wrote:
 Am 2006-06-29 23:13:15, schrieb Frank Terbeck:
 for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

 Uff... - Das verändert die ctime und mtime!

Nein. Die mtime wird von mv nicht angefasst -- die Datei wird doch nicht
modifiziert.

 Wie währe es mit:

 find -type f -name *.done -exec rename s/\.done// {}';'

Das gleiche.

% touch bla; stat bla
  File: ?bla?
  Size: 0   Blocks: 0  IO Block: 4096   reguläre leere Datei
Device: fh/15d  Inode: 368233  Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   joerg)   Gid: (  100/   users)
Access: 2006-08-18 14:10:46.0 +0200
Modify: 2006-08-18 14:10:46.0 +0200
Change: 2006-08-18 14:10:46.0 +0200
% mv bla foo; stat foo
  File: ?foo?
  Size: 0   Blocks: 0  IO Block: 4096   reguläre leere Datei
Device: fh/15d  Inode: 368233  Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   joerg)   Gid: (  100/   users)
Access: 2006-08-18 14:10:46.0 +0200
Modify: 2006-08-18 14:10:46.0 +0200
Change: 2006-08-18 14:11:09.634491311 +0200
% rename 's/foo/blubb/' foo; stat blubb
  File: ?blubb?
  Size: 0   Blocks: 0  IO Block: 4096   reguläre leere Datei
Device: fh/15d  Inode: 368233  Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/   joerg)   Gid: (  100/   users)
Access: 2006-08-18 14:10:46.0 +0200
Modify: 2006-08-18 14:10:46.0 +0200
Change: 2006-08-18 14:11:24.167221311 +0200

Schöne Grüße, Jörg.
-- 
Science is the game we play with God to find out what his rules are.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-07-01 Diskussionsfäden Frank Terbeck
Andreas Pakulat [EMAIL PROTECTED]:
 On 30.06.06 16:29:46, Frank Terbeck wrote:
  Andreas Pakulat [EMAIL PROTECTED]:
   
   ls | grep done$ | while read f...
  
  Das ist ganz einfach nicht nötig.
  Unter anderem sollte man sich sicher sein, das ls nicht als Alias
  expandiert und dann Optionen wie '--color=always' oder '-F' verwendet.
 
 --color=auto hatte ich, grad mal rausgenommen.

'auto' ist nicht gravierend, 'always' wäre gravierend, weil etwaige
Controlcodes mit ausgegeben würden, egal welches Ausgabemedium ls
erkennt.

Im übrigen sollte jede Shell mit sehr langen Listen in for Schleifen
klarkommen.
   
   Also die Bash hier kommt mit 3700 Mails im monatl. d-u-g Ordner nicht
   zurecht wenn ich alle auflisten lasse (73 Zeichen pro Zeile)
  
  Da würde mich aber interessieren, welches Kommando du da anwendest.
 
 ls, 
 [EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/curalias ls=ls
 [EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/curwhich ls
 /bin/ls
 [EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/cur/bin/ls *morpheus*
 bash: /bin/ls: Die Argumentliste ist zu lang

Ja, an einen externen Befehl können Argumentlisten schnell mal zu lang
werden. Aber es ging ja hier um for-Schleifen.

  Denn bei shellinternen Kommandos ist die Menge der Argumente lediglich
  durch den zur Verfügung stehenden Speicher begrenzt.
 
 Ich benutze kein bash-internes ls. Warum weiss ich nicht, ich hab
 diesbzgl. nichts verstellt.

Ich bin auch nicht sicher ob die bash ein internes ls hat. Das ist
aber auch nicht der Punkt. Wenn die Argumentliste zu lang wird, dann
kann man das triviale Kommando entweder in eine for-Schleife umwandeln
oder spezialisierte Programme wie xargs verwenden.

  Ich habe gerade mal eine bash gestartet und eine for Schleife mit vier
  Millionen Argumenten gestartet:
  
  for i in $(seq 1 400) ; do echo $i ; done
 
 for geht hier auch wunderbar.

Gut, und daher wird in deinem Anwendungsfall auch eine Schleife der
Art

for i in *morpheus* ; do ls $i ; done

funktionieren.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden Michael Dominok
Am Donnerstag, den 29.06.2006, 23:47 +0200 schrieb Robert Michel:
 Mag sein, aber es ist etwas was ich benutzen konnte ohne
 nachzuschlagen... 

Erhöht außerdem die Lesbarkeit für Leute die - wie wohl der OP - nicht
bis zu den Ellenbogen in den Gedärmen der bash stecken.




Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden kai-martin knaak
Danijel Tasov wrote:

 file=was.done
 echo ${file%.done}
 

Ah ja. Offensichtlich funktioniert dieser Trick nur mit Variablen. Danke.

---(kaimartin)---
-- 
Kai-Martin Knaak
http://lilalaser.de/blog


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden Andreas Pakulat
On 30.06.06 00:39:07, Danijel Tasov wrote:
 Andreas Pakulat wrote:
 Bei ls *.done | while wird die Argumentliste genauso zu lang.
 Wenn, dann muss man da find benutzen.

Stimmt.

 Ausserdem interpretiert
 read die Eingabe, hoert ein Dateiname zum beispiel mit einem
 backslash auf, empfiehlt es sich read -r zu verwenden.
 (Zugegeben, in diesem Fall kommt das nicht vor).

Ebenfalls richtig.

 Hinzukommt, dass ls | while read auch nicht geht, wenn der
 Dateiname mit Leerzeichen anfaengt, das umgeht man mit
 ls | while IFS= read -r.

Auch richtig.

 Der Haken der Jetzt noch uebrig
 bleibt, ist, wenn Newlines in einem Dateinamen vorkommen.
 Da fallen mir nur extrem haessliche Loesungen fuer ein.

find hilft doch aber, oder irre ich mich jetzt? find kennt -print0, man
muesste also IFS nur auf \0 umbiegen, ein kurzer Test dazu schlug
leider fehlt.

Andreas

-- 
Your object is to save the world, while still leading a pleasant life.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden Andreas Pakulat
On 30.06.06 01:15:54, Frank Terbeck wrote:
 Andreas Pakulat [EMAIL PROTECTED]:
 [...]
  Noch besser als for i in *.done oder for i in $(ls *.done) ist
  
  ls *.done | while read f ; do ... ; done
  
  gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
  lang und man landet auf der Nase...
 
 Also, an dieser Stelle kann das überhaupt nicht besser funktionieren
 als *.done, weil du die Dateiliste so genauso gut komplett an ls
 übergibts.

Ist ja gut :-) War ein kleiner Schnellschuss, meistens mache ich eher
sowas:

ls | grep done$ | while read f...

 Im übrigen sollte jede Shell mit sehr langen Listen in for Schleifen
 klarkommen.

Also die Bash hier kommt mit 3700 Mails im monatl. d-u-g Ordner nicht
zurecht wenn ich alle auflisten lasse (73 Zeichen pro Zeile)

In der Standardeinstellung natuerlich...

Andreas

-- 
If you stand on your head, you will get footprints in your hair.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden Frank Terbeck
Andreas Pakulat [EMAIL PROTECTED]:
 On 30.06.06 01:15:54, Frank Terbeck wrote:
  Andreas Pakulat [EMAIL PROTECTED]:
  [...]
   Noch besser als for i in *.done oder for i in $(ls *.done) ist
   
   ls *.done | while read f ; do ... ; done
   
   gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
   lang und man landet auf der Nase...
  
  Also, an dieser Stelle kann das überhaupt nicht besser funktionieren
  als *.done, weil du die Dateiliste so genauso gut komplett an ls
  übergibts.
 
 Ist ja gut :-) War ein kleiner Schnellschuss, meistens mache ich eher
 sowas:
 
 ls | grep done$ | while read f...

Das ist ganz einfach nicht nötig.
Unter anderem sollte man sich sicher sein, das ls nicht als Alias
expandiert und dann Optionen wie '--color=always' oder '-F' verwendet.

  Im übrigen sollte jede Shell mit sehr langen Listen in for Schleifen
  klarkommen.
 
 Also die Bash hier kommt mit 3700 Mails im monatl. d-u-g Ordner nicht
 zurecht wenn ich alle auflisten lasse (73 Zeichen pro Zeile)

Da würde mich aber interessieren, welches Kommando du da anwendest.

Denn bei shellinternen Kommandos ist die Menge der Argumente lediglich
durch den zur Verfügung stehenden Speicher begrenzt.

Ich habe gerade mal eine bash gestartet und eine for Schleife mit vier
Millionen Argumenten gestartet:

for i in $(seq 1 400) ; do echo $i ; done

Das dauert zwar ewig und verbraucht Speicher wie nichts Gutes. Aber es
funktioniert. Wenn man die Argumentliste noch grösser macht, dann
rennt man irgendwann in Out of Memory Situationen, je nach dem wie
gut der jeweilige Rechner bestückt ist.

Knapp 4000 Dateien werden überhaupt kein Problem sein. Ich habe hier
nur mal zur Demonstration die *.{c,h} Dateinen in einem relativ
aktuellen Linux Kernel Baum gezählt:

[snip]
/src/linux-2.6.16.16% for i in **/*.[ch] ; do echo $i ; done | wc -l
15793
[snap]

Wo ich schon mal dabei bin, zähle ich noch schnell sämtliche regulären
Dateien auf meinem Laptop:

[snap]
~% for i in /**/*(.) ; do echo $i ; done | wc -l
193183
[snap]

Also knapp Zweihunderttausend Dateien. Alles kein Problem.
Ich bin im realen Leben bisher noch nie an das theoretische Limit des
Speichers angelangt. Höchstens durch Experimente wie das oben
genannte.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-30 Diskussionsfäden Andreas Pakulat
On 30.06.06 16:29:46, Frank Terbeck wrote:
 Andreas Pakulat [EMAIL PROTECTED]:
  On 30.06.06 01:15:54, Frank Terbeck wrote:
   Andreas Pakulat [EMAIL PROTECTED]:
   [...]
Noch besser als for i in *.done oder for i in $(ls *.done) ist

ls *.done | while read f ; do ... ; done

gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
lang und man landet auf der Nase...
   
   Also, an dieser Stelle kann das überhaupt nicht besser funktionieren
   als *.done, weil du die Dateiliste so genauso gut komplett an ls
   übergibts.
  
  Ist ja gut :-) War ein kleiner Schnellschuss, meistens mache ich eher
  sowas:
  
  ls | grep done$ | while read f...
 
 Das ist ganz einfach nicht nötig.
 Unter anderem sollte man sich sicher sein, das ls nicht als Alias
 expandiert und dann Optionen wie '--color=always' oder '-F' verwendet.

--color=auto hatte ich, grad mal rausgenommen.

   Im übrigen sollte jede Shell mit sehr langen Listen in for Schleifen
   klarkommen.
  
  Also die Bash hier kommt mit 3700 Mails im monatl. d-u-g Ordner nicht
  zurecht wenn ich alle auflisten lasse (73 Zeichen pro Zeile)
 
 Da würde mich aber interessieren, welches Kommando du da anwendest.

ls, 
[EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/curalias ls=ls
[EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/curwhich ls
/bin/ls
[EMAIL PROTECTED]:~/.Mail/debian-user-german.2006-05/cur/bin/ls *morpheus*
bash: /bin/ls: Die Argumentliste ist zu lang

 Denn bei shellinternen Kommandos ist die Menge der Argumente lediglich
 durch den zur Verfügung stehenden Speicher begrenzt.

Ich benutze kein bash-internes ls. Warum weiss ich nicht, ich hab
diesbzgl. nichts verstellt.

 Ich habe gerade mal eine bash gestartet und eine for Schleife mit vier
 Millionen Argumenten gestartet:
 
 for i in $(seq 1 400) ; do echo $i ; done

for geht hier auch wunderbar.

Andreas

-- 
You will be the victim of a bizarre joke.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic

Hallo zusammen,

kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
einen Tip geben, ich möchte Dateinamen mit einer bestimmten Endung um 
eben diese Endung kürzen.

Also z.B.:
Ich habe in einem Verzeichnis viele Dateien, die nach folgendem Schema 
benannt sind:

*.tar.gz.done

und würde gerne in den Dateinamen das .done abschneiden, so daß am Ende 
nur noch Dateinamen mit dem Schema

*.tar.gz übrigbleiben.

Any idea?


Gruß
Dejan


--
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden wolfgang friedl
Dejan Milosavljevic wrote:
 Hallo zusammen,
 
 kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen
 einen Tip geben, ich möchte Dateinamen mit einer bestimmten Endung um
 eben diese Endung kürzen.
 Also z.B.:
 Ich habe in einem Verzeichnis viele Dateien, die nach folgendem Schema
 benannt sind:
 *.tar.gz.done
 
 und würde gerne in den Dateinamen das .done abschneiden, so daß am Ende
 nur noch Dateinamen mit dem Schema
 *.tar.gz übrigbleiben.
 
 Any idea?
 
 
 Gruß
 Dejan
 
 

Hallo,

falls ein GUI gewuenscht ist und KDE installiert ist / KDE Anwendungen
unter Gnome laufen: krename
lg
-- 
###
   #   #
# #
  wolfgang
# #
   #   #friedl


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Dejan Milosavljevic [EMAIL PROTECTED]:
 kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
 einen Tip geben, ich möchte Dateinamen mit einer bestimmten Endung um 
 eben diese Endung kürzen.
 Also z.B.:
 Ich habe in einem Verzeichnis viele Dateien, die nach folgendem Schema 
 benannt sind:
 *.tar.gz.done
 
 und würde gerne in den Dateinamen das .done abschneiden, so daß am Ende 
 nur noch Dateinamen mit dem Schema
 *.tar.gz übrigbleiben.

for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Evgeni Golov
On Thu, 29 Jun 2006 23:05:01 +0200 wolfgang friedl
[EMAIL PROTECTED] wrote:

 Dejan Milosavljevic wrote:
  Hallo zusammen,
  
  kann jemand einem der Kunst des Skript-Schreibens nicht sooo
  kundigen einen Tip geben, ich möchte Dateinamen mit einer
  bestimmten Endung um eben diese Endung kürzen.
  Also z.B.:
  Ich habe in einem Verzeichnis viele Dateien, die nach folgendem
  Schema benannt sind:
  *.tar.gz.done
  
  und würde gerne in den Dateinamen das .done abschneiden, so daß am
  Ende nur noch Dateinamen mit dem Schema
  *.tar.gz übrigbleiben.
  
  Any idea?
  
  
  Gruß
  Dejan
  
  
 
 Hallo,
 
 falls ein GUI gewuenscht ist und KDE installiert ist / KDE Anwendungen
 unter Gnome laufen: krename
 lg

Und wenn weder KDE noch GUI, dann lässt du das k vorne weg. rename ist
ein mächtiges Tool, das gut RegEx spricht etc. Ist übrigens ein Teil
des perl Packages.

-- 
   ^^^| Evgeni -SargentD- Golov ([EMAIL PROTECTED])
 d(O_o)b  | PGP-Key-ID: 0xAC15B50C
  -|-   | WWW: http://www.die-welt.net   ICQ: 54116744
   / \| IRC: #sod @ irc.german-freakz.net

Fuer windows hab keine Zeit weil wenn ich nachhause komm will ich
lieber poppen und nich noch mein OS reparieren (Therion -
german-freakz.net)


pgpLdBdfEGHd9.pgp
Description: PGP signature


Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden kai-martin knaak
Dejan Milosavljevic wrote:

 und würde gerne in den Dateinamen das .done abschneiden, so daß am Ende
 nur noch Dateinamen mit dem Schema
 *.tar.gz übrigbleiben.
 

man basename

Im speziellen Fall:

for i in *.done ; do mv $i `basename $i .done` ; done

Statt den Semicolons kannst Du das Ganze auch auf drei Zeilen verteilen.
Beachte, dass der basename-Befehl von dem Anführungszeichen eingerahmt ist,
das man mit shift auf der Taste schräg über dem ü bekommt.  

---(kaimartin)---
-- 
Kai-Martin Knaak
http://lilalaser.de/blog


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




kai-martin knaak schrieb:

  Dejan Milosavljevic wrote:

  
  
und wrde gerne in den Dateinamen das .done abschneiden, so da am Ende
nur noch Dateinamen mit dem Schema
*.tar.gz brigbleiben.


  
  
man basename

Im speziellen Fall:

for i in *.done ; do mv $i `basename $i .done` ; done

Statt den Semicolons kannst Du das Ganze auch auf drei Zeilen verteilen.
Beachte, dass der basename-Befehl von dem Anfhrungszeichen eingerahmt ist,
das man mit shift auf der Taste schrg ber dem  bekommt.  

---(kaimartin)---
  

Ja prima, basename ist fr mich das Mittel der ersten Wahl. So einfach
gehts. :-)
Vielen Dank, auch den anderen mit den schnellen Antworten. Die Lsung
mit rename ist auch recht schlank anwendbar, habe aber in der Krze der
zur Verfgung stehenden Zeit keinen Nerv mich mit Perl-Regexp
auseinanderzusetzen. Nochmals danke!

Gru
Dejan




Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
kai-martin knaak [EMAIL PROTECTED]:
 Dejan Milosavljevic wrote:
  und würde gerne in den Dateinamen das .done abschneiden, so daß am Ende
  nur noch Dateinamen mit dem Schema
  *.tar.gz übrigbleiben.
 
 man basename

Wozu einen externes Programm, wenn das mit shellinternen Mitteln
problemlos zu lösen ist?

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Robert Michel
Salve Dejan!

Hast Du keine Lösungsidee, keinen eignen Ansatz?




On Thu, 29 Jun 2006, Dejan Milosavljevic wrote:

 Hallo zusammen,
 
 kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
 einen Tip geben, 

http://www.tldp.org/LDP/abs/html/  

 *.tar.gz.done
-
 *.tar.gz übrigbleiben.
 Any idea?

for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done

(Diese Lösung gilt für die Bash, inwieweit dies Lösung bei
anderen Shells laufen weiß ich nicht.)

Wie kommt man auf soetwas?
1. alle Dateinamen ausgeben, die mit *.done enden:
   ls *.done
2. man möchte diese Liste verarbeiten, man könnte es in eine Datei
   schreiben, oder halt mit einer Subshell $( Befehl| Befehl2) 
   abarbeiten und ausgeben lassen.
3. ein Schleife kann man mit Parameter aus einer Datei, oder halt
   aus eine Subshell füttern
   for i in Dateiname; do befehl1| befehl2; done
   innerhalb kann man die Variable $i benutzen


Also 1. liefert z.B.
done.1.done
done.2.done
done.3.done

for i in (ls *.done)

erzeugt 3 Schleifendurchgänge, wobei bei der ersten
$i = done.1.done ist
beim zweiten
$i = done.2.done
usw

jetzt will man die Files umbennen, das geht mit mv
mv $i $VerkürzterDateiname

Wie kann man den Dateinamen kürzen? Sed!

echo done.1.done | sed s/done//
würde .1. liefern - es könne ein done im Dateinamen stecken.
Will man nur das .done am ende löschen, so braucht man die
Regular Expression $ die das Zeilenende markiert.
.done$ ist also ein Muster, welches nur am Ende vorkommt,
diese Muster kann man durch // also nichts ersetzten:

Statt direkt mv die Dateinamen zu ändern und sich mit einem
Denkfehler einzuhandeln ersteinmal ohne mv laufen lassen:
ls *.done
- Ok ich habe alle Dateien die ich verändern will

for i in $(ls *.done); do echo $i| sed s/.done$//; done
- Ok, die veränderung ist für alle korrekt

for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done


Skripten lernt man in dem man damit rumspielt und von einfacheren
Lösungen Schrittweise ins komplexerer geht. Hat man eine relativ
komplexe Aufgabe, so teilt man sie in kleine Probleme, bei der
man teilweise die Lösungen schon kennt, oder weis wie es geht
- Schritt für schritt wird man mit dem Skripten vertrauter.
Bevor man eine Mailingliste fragt, sollte man zumindest eine
Weile über eingene Lösungsmöglichkeiten nachdenken und dann
sein Wissen ergänzen lassen.

Und ich würde nicht sagen, das ich viel kann.
also viel Spaß beim Lernen,

rob






   





Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




Frank Terbeck schrieb:

  kai-martin knaak [EMAIL PROTECTED]:
  
  
Dejan Milosavljevic wrote:


  und wrde gerne in den Dateinamen das .done abschneiden, so da am Ende
nur noch Dateinamen mit dem Schema
*.tar.gz brigbleiben.
  

man basename

  
  
Wozu einen externes Programm, wenn das mit shellinternen Mitteln
problemlos zu lsen ist?

Gruss, Frank


  

Und? Spann uns nicht auf die Folter. ;-)
Wie sieht dein Vorschlag aus?

Gru
Dejan




Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




Robert Michel schrieb:

  Salve Dejan!

Hast Du keine Lösungsidee, keinen eignen Ansatz?




On Thu, 29 Jun 2006, Dejan Milosavljevic wrote:

  
  
Hallo zusammen,

kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
einen Tip geben, 

  
  
http://www.tldp.org/LDP/abs/html/  

  
  
*.tar.gz.done

  
  -
  
  
*.tar.gz übrigbleiben.
Any idea?

  
  
for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done

(Diese Lösung gilt für die Bash, inwieweit dies Lösung bei
anderen Shells laufen weiß ich nicht.)

Wie kommt man auf soetwas?
1. alle Dateinamen ausgeben, die mit *.done enden:
   ls *.done
2. man möchte diese Liste verarbeiten, man könnte es in eine Datei
   schreiben, oder halt mit einer Subshell $( Befehl| Befehl2) 
   abarbeiten und ausgeben lassen.
3. ein Schleife kann man mit Parameter aus einer Datei, oder halt
   aus eine Subshell füttern
   for i in Dateiname; do befehl1| befehl2; done
   innerhalb kann man die Variable $i benutzen


Also 1. liefert z.B.
done.1.done
done.2.done
done.3.done

for i in (ls *.done)

erzeugt 3 Schleifendurchgänge, wobei bei der ersten
$i = done.1.done ist
beim zweiten
$i = done.2.done
usw

jetzt will man die Files umbennen, das geht mit mv
mv $i $VerkürzterDateiname

Wie kann man den Dateinamen kürzen? Sed!

echo done.1.done | sed s/done//
würde .1. liefern - es könne ein done im Dateinamen stecken.
Will man nur das .done am ende löschen, so braucht man die
Regular _expression_ $ die das Zeilenende markiert.
".done$" ist also ein Muster, welches nur am Ende vorkommt,
diese Muster kann man durch // also nichts ersetzten:

Statt direkt mv die Dateinamen zu ändern und sich mit einem
Denkfehler einzuhandeln ersteinmal ohne mv laufen lassen:
ls *.done
- Ok ich habe alle Dateien die ich verändern will

for i in $(ls *.done); do echo $i| sed s/.done$//; done
- Ok, die veränderung ist für alle korrekt

for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done


Skripten lernt man in dem man damit rumspielt und von einfacheren
Lösungen Schrittweise ins komplexerer geht. Hat man eine relativ
komplexe Aufgabe, so teilt man sie in kleine Probleme, bei der
man teilweise die Lösungen schon kennt, oder weis wie es geht
- Schritt für schritt wird man mit dem Skripten vertrauter.
Bevor man eine Mailingliste fragt, sollte man zumindest eine
Weile über eingene Lösungsmöglichkeiten nachdenken und dann
sein Wissen ergänzen lassen.

Und ich würde nicht sagen, das ich viel kann.
also viel Spaß beim Lernen,

rob






   



  

Hallo Michel,

ich habe hier einen halben Tag lang mit awk rumprobiert, aber kam auf
keine grünen Zweig.
Stell Dir vor: Ich habs nicht hinbekommen!

Gruß
Dejan




Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Robert Michel [EMAIL PROTECTED]:
 On Thu, 29 Jun 2006, Dejan Milosavljevic wrote:
  Hallo zusammen,
  
  kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
  einen Tip geben, 
 
 http://www.tldp.org/LDP/abs/html/  
 
  *.tar.gz.done
 -
  *.tar.gz übrigbleiben.
  Any idea?
 
 for i in $(ls *.done); do mv $i $(echo $i| sed s/.done$//); done
 
 (Diese Lösung gilt für die Bash, inwieweit dies Lösung bei
 anderen Shells laufen weiß ich nicht.)
 
 Wie kommt man auf soetwas?

Ja.
Wozu ls benutzen um an eine Dateiliste zu kommen?
Das ist ja wild. Einfach 'for i in *.done' reicht.
Und sed zu bemühen nur um einen String am Ende einer Variable
abzuschneiden, ist auch Overkill ohne Ende.
${i%.done} funktioniert in sämtlichen POSIX konformen Shells.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Evgeni Golov
On Thu, 29 Jun 2006 23:31:23 +0200 Dejan Milosavljevic
[EMAIL PROTECTED] wrote:

 Vielen Dank, auch den anderen mit den schnellen Antworten. Die Lösung 
 mit rename ist auch recht schlank anwendbar, habe aber in der Kürze
 der zur Verfügung stehenden Zeit keinen Nerv mich mit Perl-Regexp 
 auseinanderzusetzen. Nochmals danke!

rename 's/.done//' *.done
Ist ja wohl kaum schwer, und auch keine PerlRegex eigenart ;-)

-- 
   ^^^| Evgeni -SargentD- Golov ([EMAIL PROTECTED])
 d(O_o)b  | PGP-Key-ID: 0xAC15B50C
  -|-   | WWW: http://www.die-welt.net   ICQ: 54116744
   / \| IRC: #sod @ irc.german-freakz.net

Frueher nahmen wir pr0n, um die Leitung vollzumachen. Heute tun's auch
KDE-updates (jjFux - IRCNet)


pgpjA5fkSB1X0.pgp
Description: PGP signature


Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Dejan Milosavljevic [EMAIL PROTECTED]:
 Wozu einen externes Programm, wenn das mit shellinternen Mitteln
 problemlos zu lösen ist?
 
 Und? Spann uns nicht auf die Folter. ;-)
 Wie sieht dein Vorschlag aus?

Habe die Antwort schon vorher in den Thread geschickt.
Siehe auch: [EMAIL PROTECTED]

${file%.done}

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Evgeni Golov
On Thu, 29 Jun 2006 23:39:02 +0200 Evgeni Golov [EMAIL PROTECTED]
wrote:

 On Thu, 29 Jun 2006 23:31:23 +0200 Dejan Milosavljevic
 [EMAIL PROTECTED] wrote:
 
  Vielen Dank, auch den anderen mit den schnellen Antworten. Die
  Lösung mit rename ist auch recht schlank anwendbar, habe aber in
  der Kürze der zur Verfügung stehenden Zeit keinen Nerv mich mit
  Perl-Regexp auseinanderzusetzen. Nochmals danke!
 
 rename 's/.done//' *.done
^ ups, \.

Hm, just for the case, du hast mehrere .done im namen:
s/\.done$//

-- 
   ^^^| Evgeni -SargentD- Golov ([EMAIL PROTECTED])
 d(O_o)b  | PGP-Key-ID: 0xAC15B50C
  -|-   | WWW: http://www.die-welt.net   ICQ: 54116744
   / \| IRC: #sod @ irc.german-freakz.net

Wir sind Borg, Widerstand ist Spannung durch Stromstärke!


pgpunyXImM6wS.pgp
Description: PGP signature


Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




Frank Terbeck schrieb:

  Dejan Milosavljevic [EMAIL PROTECTED]:
  
  
kann jemand einem der Kunst des Skript-Schreibens nicht sooo kundigen 
einen Tip geben, ich mchte Dateinamen mit einer bestimmten Endung um 
eben diese Endung krzen.
Also z.B.:
Ich habe in einem Verzeichnis viele Dateien, die nach folgendem Schema 
benannt sind:
*.tar.gz.done

und wrde gerne in den Dateinamen das .done abschneiden, so da am Ende 
nur noch Dateinamen mit dem Schema
*.tar.gz brigbleiben.

  
  
for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

Gruss, Frank


  

Sorry, ich verstehe es nicht, auch wenns ein Einzeiler ist: Mein Auge
bleibt immer am % in ${file%.done}hngen - was hat es damit auf sich?




Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Robert Michel
Salve Frank!

On Thu, 29 Jun 2006, Frank Terbeck wrote:
 Ja.
 Wozu ls benutzen um an eine Dateiliste zu kommen?
 Das ist ja wild. Einfach 'for i in *.done' reicht.

Das habe ich eben auch gesehen, ich hätte gedacht
das 'for i in file' die Datei file genommen hätte...
Viele Wege führen nach rom, wenn man ls *.done kennt,
so kann man dies doch ruhig benutzen - mag zwar
wild sein aber das nette einer Mailingliste ist,
das man feedback bekommt, wie man es besser, wie man
es alternativ machen kann. 

 Und sed zu bemühen nur um einen String am Ende einer Variable
 abzuschneiden, ist auch Overkill ohne Ende.

Mag sein, aber es ist etwas was ich benutzen konnte ohne
nachzuschlagen... 

 ${i%.done} funktioniert in sämtlichen POSIX konformen Shells.

Kann man das auch so in VIM benuzten? Die Sedausdrrücke schon,
und ich nutze VIM auch zusammen mit mutt und elinks täglich ;)

Trozdem nett dazuzuleren... ;)

rob



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Michael Müller

Dejan Milosavljevic schrieb:


Hallo Michel,

ich habe hier einen halben Tag lang mit awk rumprobiert, aber kam auf 
keine grünen Zweig.

Stell Dir vor: Ich habs nicht hinbekommen!

Gruß
Dejan


Hallo Dejan,

auch das hättest du recht einfach haben können ...

for i in *done
do
   echo $i | awk -F.done '{print $1}'
done

Ist aber mit Kanonen auf Spatzen schießen ;-)

Gruß
; Michael


--
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Dejan Milosavljevic [EMAIL PROTECTED]:
 Frank Terbeck schrieb:
 for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done
 
 Sorry, ich verstehe es nicht, auch wenns ein Einzeiler ist: Mein Auge 
 bleibt immer am % in  ${file%.done}hängen - was hat es damit auf sich?

Ist ja nicht schlimm. Als erster Anlaufpunkt ist bei sowas immer die
Doku der Shell die man nutzt. Da sollte sowas auf jeden Fall erläutert
sein. Ich zitiere mal aus dem SUSv3 Standard:

[snip]
${parameter%word}
  Remove Smallest Suffix Pattern. The word shall be expanded to produce a
  pattern. The parameter expansion shall then result in parameter, with the
  smallest portion of the suffix matched by the pattern deleted.
[snap]

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Andreas Pakulat
On 29.06.06 23:47:22, Robert Michel wrote:
 Salve Frank!
 
 On Thu, 29 Jun 2006, Frank Terbeck wrote:
  Ja.
  Wozu ls benutzen um an eine Dateiliste zu kommen?
  Das ist ja wild. Einfach 'for i in *.done' reicht.
 
 Das habe ich eben auch gesehen, ich hätte gedacht
 das 'for i in file' die Datei file genommen hätte...
 Viele Wege führen nach rom, wenn man ls *.done kennt,
 so kann man dies doch ruhig benutzen - mag zwar
 wild sein aber das nette einer Mailingliste ist,
 das man feedback bekommt, wie man es besser, wie man
 es alternativ machen kann. 

Noch besser als for i in *.done oder for i in $(ls *.done) ist

ls *.done | while read f ; do ... ; done

gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
lang und man landet auf der Nase...

Andreas

-- 
You prefer the company of the opposite sex, but are well liked by your own.


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



BTW everything is a file , but.... wie hätte man es mit vim machen k önnen? Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Robert Michel
Salve Michael!
 auch das hättest du recht einfach haben können ...
 
 for i in *done
 do
echo $i | awk -F.done '{print $1}'
 done

Das ändert die Dateinamen?

 Ist aber mit Kanonen auf Spatzen schießen ;-)

also ich habe ein verzeichnis Test
vim Test
:%s/.done$//
E21: Kann keine Änderungen machen, 'modifiable' ist aus  
:set modifiable
:%s/.done$//

W10: Warnung: Ändern einer schreibgeschützten Datei
4 Ersetzungen auf 4 Zeilen
Drücken Sie die EINGABETASTE oder geben Sie einen Befehl ein

EINGABETASTE
;)
:wq

E382: Kann nicht schreiben, 'buftype'-Option ist gesetzt  
:set buftype
   buftype=nowrite 

Vielleicht
:set buftype=write
E474: Invalid argument: buftype=write   


Also, wie ginge es mit VIM?

rob


  



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Frank Terbeck [EMAIL PROTECTED]:
 for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

Ich hasse es mich selber verbessern zu müssen, aber als altem zshler
sind einem Dateinamen mit Leerzeichen ziemlich egal. Die meisten
anderen Shells müssen darauf achten. Also besser:

for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




Frank Terbeck schrieb:

  Dejan Milosavljevic [EMAIL PROTECTED]:
  
  
Frank Terbeck schrieb:


  for file in *.tar.gz.done ; do mv -i $file ${file%.done} ; done

  

Sorry, ich verstehe es nicht, auch wenns ein Einzeiler ist: Mein Auge 
bleibt immer am % in  ${file%.done}hngen - was hat es damit auf sich?

  
  
Ist ja nicht schlimm. Als erster Anlaufpunkt ist bei sowas immer die
Doku der Shell die man nutzt. Da sollte sowas auf jeden Fall erlutert
sein. Ich zitiere mal aus dem SUSv3 Standard:

[snip]
${parameter%word}
  Remove Smallest Suffix Pattern. The word shall be expanded to produce a
  pattern. The parameter expansion shall then result in parameter, with the
  smallest portion of the suffix matched by the pattern deleted.
[snap]

Gruss, Frank


  

Also bei mir funktionierts nicht. Es kommt folgende Fehlermeldung
(benutze brigens Sarge):

www:~/hilf# for file in *.tar.gz.done ; do mv -i $file $(file%.done)
; done
-bash: file%.done: command not found
mv: Fehlendes Dateiargument
,,mv --help" gibt weitere Informationen.
www:~/hilf# -bash: file%.done: command not found

Habe vorher ein Testfile angelegt (touch foo.tar.gz.done)

Und bei Dir gehts mit der Bash unter Debian? Wo ist nun der Unterschied
zwischen unseren Shells?

Gru
Dejan





Re: BTW everything is a file, but .... wie hätte man es mit vim mac hen können? Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Michael Müller

Robert Michel schrieb:


Salve Michael!


auch das hättest du recht einfach haben können ...

for i in *done
do
  echo $i | awk -F.done '{print $1}'
done



Das ändert die Dateinamen?



Nee sorry, war nicht zu Ende gebracht, es zeigt nur die Namen ohne die 
Erweiterung. Wollte ja auch nur demonstrieren, dass awk das auch kann. 
Aber mit einem weiteren Handgriff ...


Gruß
; Michael


--
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/


Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Dejan Milosavljevic [EMAIL PROTECTED]:
 Frank Terbeck schrieb:
 ${parameter%word}
 
 Also bei mir funktionierts nicht. Es kommt folgende Fehlermeldung 
 (benutze übrigens Sarge):
 
 /www:~/hilf# for file in *.tar.gz.done ; do mv -i $file $(file%.done) ; done
 -bash: file%.done: command not found
 mv: Fehlendes Dateiargument
 ,,mv --help gibt weitere Informationen.
 www:~/hilf# -bash: file%.done: command not found/
 
 Habe vorher ein Testfile angelegt (touch foo.tar.gz.done)
 
 Und bei Dir gehts mit der Bash unter Debian? Wo ist nun der Unterschied 
 zwischen unseren Shells?

Nein, meine Lösung funktioniert in jeder Shell die sich an POSIX hält.
Damit auch in bash, zsh oder auch dash.

Dein Fehler ist, dass du nicht richtig gelesen hast. $(...) macht
nämlich etwas ganz anderes als ${...}.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Dejan Milosavljevic




Frank Terbeck schrieb:

  Dejan Milosavljevic [EMAIL PROTECTED]:
  
  
Frank Terbeck schrieb:


  ${parameter%word}

  

Also bei mir funktionierts nicht. Es kommt folgende Fehlermeldung 
(benutze brigens Sarge):

/www:~/hilf# for file in *.tar.gz.done ; do mv -i $file $(file%.done) ; done
-bash: file%.done: command not found
mv: Fehlendes Dateiargument
,,mv --help" gibt weitere Informationen.
www:~/hilf# -bash: file%.done: command not found/

Habe vorher ein Testfile angelegt (touch foo.tar.gz.done)

Und bei Dir gehts mit der Bash unter Debian? Wo ist nun der Unterschied 
zwischen unseren Shells?

  
  
Nein, meine Lsung funktioniert in jeder Shell die sich an POSIX hlt.
Damit auch in bash, zsh oder auch dash.

Dein Fehler ist, dass du nicht richtig gelesen hast. $(...) macht
nmlich etwas ganz anderes als ${...}.

Gruss, Frank


  

Dafr hast Du um so genauer gelesen. Shit, das war ein blder Vertipper
und erst auf dem fnften Blick die geschweifte Klammer auszumachen. So
gehts. Alles klar, ich habe dazugelernt. DANKE!




Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Danijel Tasov
Andreas Pakulat wrote:
 Noch besser als for i in *.done oder for i in $(ls *.done) ist
 
 ls *.done | while read f ; do ... ; done
 
 gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
 lang und man landet auf der Nase...

$(ls *.done) faellt ausserdem auch auf die Nase, wenn Leerzeichen
oder Newslines in den Dateinamen vorkommen.

Bei ls *.done | while wird die Argumentliste genauso zu lang.
Wenn, dann muss man da find benutzen. Ausserdem interpretiert
read die Eingabe, hoert ein Dateiname zum beispiel mit einem
backslash auf, empfiehlt es sich read -r zu verwenden.
(Zugegeben, in diesem Fall kommt das nicht vor).

Hinzukommt, dass ls | while read auch nicht geht, wenn der
Dateiname mit Leerzeichen anfaengt, das umgeht man mit
ls | while IFS= read -r. Der Haken der Jetzt noch uebrig
bleibt, ist, wenn Newlines in einem Dateinamen vorkommen.
Da fallen mir nur extrem haessliche Loesungen fuer ein. Deshalb
nimmt einfach die zsh: ;)

autoload -U zmv
zmv '(*).done' '$1'

-DaTa
-- 
If you want to program in C, program in C.  It's a nice language.  I
use it occasionally...   :-)
 -- Larry Wall in [EMAIL PROTECTED]


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden kai-martin knaak
Frank Terbeck wrote:

 Wozu einen externes Programm, wenn das mit shellinternen Mitteln
 problemlos zu lösen ist?

Habe basename vor Jahr und Tag aus einem Unix Buch gelernt. 

 
 ${file%.done}
 

Das gibt bei mir nur eine Fehlermeldung: 

$ touch was.done; echo ${was.done%.done}
bash: ${was.done%.done}: bad substitution

Offensichtlich habe ich da was flashc verstanden :-|

---(kaimartin)---
-- 
Kai-Martin Knaak
http://lilalaser.de/blog


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Danijel Tasov
kai-martin knaak wrote:
 Das gibt bei mir nur eine Fehlermeldung: 
 
 $ touch was.done; echo ${was.done%.done}
 bash: ${was.done%.done}: bad substitution

Ja.

file=was.done
echo ${file%.done}
-DaTa
-- 
If you consistently take an antagonistic approach, however, people are
going to start thinking you're from New York.   :-)
 -- Larry Wall to Dan Bernstein in [EMAIL PROTECTED]


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Andreas Pakulat [EMAIL PROTECTED]:
[...]
 Noch besser als for i in *.done oder for i in $(ls *.done) ist
 
 ls *.done | while read f ; do ... ; done
 
 gerade wenns sehr viele Dateien sind, denn dann ist die Argumentliste zu
 lang und man landet auf der Nase...

Also, an dieser Stelle kann das überhaupt nicht besser funktionieren
als *.done, weil du die Dateiliste so genauso gut komplett an ls
übergibts.

Im übrigen sollte jede Shell mit sehr langen Listen in for Schleifen
klarkommen. Deswegen kann man ja gerade dieses Argumentlimit für
Programme mit for Schleifen umgehen. Hier wird schliesslich keine
Argumentliste an ein externes Programm übergeben.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
Danijel Tasov [EMAIL PROTECTED]:
[...]
 Hinzukommt, dass ls | while read auch nicht geht, wenn der
 Dateiname mit Leerzeichen anfaengt, das umgeht man mit
 ls | while IFS= read -r. Der Haken der Jetzt noch uebrig
 bleibt, ist, wenn Newlines in einem Dateinamen vorkommen.
 Da fallen mir nur extrem haessliche Loesungen fuer ein. Deshalb
 nimmt einfach die zsh: ;)
 
 autoload -U zmv
 zmv '(*).done' '$1'

Ja, alles richtig. 'zmv' löst das auch mit for-schleifen. Daher kann
man eine einfache for Schleife in jeder Shell benutzen.

Die zsh könnte das auch noch so:

  for i in *.done;do mv $i ${i:r};done

Nur der Vollständigkeit halber. :-)

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)



Re: Dateinamen kürzen

2006-06-29 Diskussionsfäden Frank Terbeck
kai-martin knaak [EMAIL PROTECTED]:
 Frank Terbeck wrote:
  ${file%.done}
 
 Das gibt bei mir nur eine Fehlermeldung: 
 
 $ touch was.done; echo ${was.done%.done}
 bash: ${was.done%.done}: bad substitution
 
 Offensichtlich habe ich da was flashc verstanden :-|

Ja. :)
Den Grund hat ja schon jemand anders genannt.
Wenn man solche Stringänderungen an festen Strings vornehmen möchte,
dann könnte man das in der zsh folgendermassen machen:

[snip]
zsh% echo ${${:-test001.tar.gz.done}%.done}
test001.tar.gz
[snap]

Ich frage mich aber warum man sowas machen wollen würde. ;)
Nebenbei sind solche nested Expansions nicht standardisiert und
funktionieren längst nicht überall. Also sollte man das in portablen
Skripten garnicht erst versuchen.

Gruss, Frank


-- 
Haeufig gestellte Fragen und Antworten (FAQ): 
http://www.de.debian.org/debian-user-german-FAQ/

Zum AUSTRAGEN schicken Sie eine Mail an [EMAIL PROTECTED]
mit dem Subject unsubscribe. Probleme? Mail an [EMAIL PROTECTED] (engl)