Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.os.unix.shell > #10473 > unrolled thread

Verzeichnisse mit Leerzeichen umwandeln

Started byMichael Wagner <wagner_m_bremen@web.de>
First post2018-09-08 10:02 +0000
Last post2018-09-18 18:40 +0200
Articles 20 on this page of 42 — 13 participants

Back to article view | Back to de.comp.os.unix.shell


Contents

  Verzeichnisse mit Leerzeichen umwandeln Michael Wagner <wagner_m_bremen@web.de> - 2018-09-08 10:02 +0000
    Re: Verzeichnisse mit Leerzeichen umwandeln Elias Schwerdtfeger <nachtwaechter@tamagothi.de> - 2018-09-08 12:47 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-08 12:29 +0000
        Re: Verzeichnisse mit Leerzeichen umwandeln Elias Schwerdtfeger <nachtwaechter@tamagothi.de> - 2018-09-10 12:10 +0200
          Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-10 13:34 +0200
          Re: Verzeichnisse mit Leerzeichen umwandeln Sieghard Schicktanz <Sieghard.Schicktanz@SchS.de> - 2018-09-10 20:34 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-08 13:40 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Michael Wagner <wagner_m_bremen@web.de> - 2018-09-08 12:17 +0000
        Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-08 15:15 +0200
          Re: Verzeichnisse mit Leerzeichen umwandeln Michael Wagner <wagner_m_bremen@web.de> - 2018-09-08 15:49 +0000
            Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-08 18:41 +0200
            Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-08 16:42 +0000
              Re: Verzeichnisse mit Leerzeichen umwandeln Christian Weisgerber <naddy@mips.inka.de> - 2018-09-12 12:37 +0000
            Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-08 23:07 +0200
              Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-08 21:56 +0000
                Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-09 08:56 +0200
                  Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-09 10:32 +0000
                    Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-09 22:32 +0200
                      Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-09 21:08 +0000
                        Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-09 23:46 +0200
                          Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-10 00:23 +0200
                            Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-13 00:48 +0200
                              Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-14 20:14 +0200
                                Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-18 13:12 +0200
              Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-09 11:05 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-08 12:30 +0000
    Re: Verzeichnisse mit Leerzeichen umwandeln Juergen Ilse <news@usenet-verwaltung.de> - 2018-09-08 12:24 +0000
      Re: Verzeichnisse mit Leerzeichen umwandeln Michael Wagner <wagner_m_bremen@web.de> - 2018-09-08 13:08 +0000
      Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Waitzmann <nn.throttle@xoxy.net> - 2018-09-09 03:04 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Waitzmann <nn.throttle@xoxy.net> - 2018-09-09 10:01 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Ulli Horlacher <framstag@rus.uni-stuttgart.de> - 2018-09-09 09:47 +0000
      Re: Verzeichnisse mit Leerzeichen umwandeln Christian Schneider <strcat@gmx.net> - 2018-09-09 15:51 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Stefan Reuther <stefan.news@arcor.de> - 2018-09-09 11:39 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Michael Wagner <wagner_m_bremen@web.de> - 2018-09-09 14:12 +0200
        Re: Verzeichnisse mit Leerzeichen umwandeln Stefan Reuther <stefan.news@arcor.de> - 2018-09-10 19:17 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-10 16:23 +0200
        Re: Verzeichnisse mit Leerzeichen umwandeln Stefan Reuther <stefan.news@arcor.de> - 2018-09-10 19:10 +0200
          Re: Verzeichnisse mit Leerzeichen umwandeln Helmut Schellong <rip@schellong.biz> - 2018-09-11 00:47 +0200
      Re: Verzeichnisse mit Leerzeichen umwandeln Christoph 'Mehdorn' Weber <spam-fuer@das-mehdorn.de> - 2018-09-10 16:21 +0200
        Re: Verzeichnisse mit Leerzeichen umwandeln Stefan Reuther <stefan.news@arcor.de> - 2018-09-10 19:19 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Thomas Orgelmacher <trash@odbs.org> - 2018-09-10 20:13 +0200
    Re: Verzeichnisse mit Leerzeichen umwandeln Bernd Mayer <beam.bam.boom@knuut.de> - 2018-09-18 18:40 +0200

Page 2 of 3 — ← Prev page 1 [2] 3  Next page →


#10512

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-10 00:23 +0200
Message-ID<pn46hm$9t3$1@solani.org>
In reply to#10511
On 09/09/2018 23:46, Helmut Schellong wrote:
> On 09/09/2018 23:08, Juergen Ilse wrote:
>> Hallo,
>>
>> Helmut Schellong <rip@schellong.biz> wrote:
>>> On 09/09/2018 12:32, Juergen Ilse wrote:
>> [...]
>>> o  Desweiteren hat ein Shell-Programm vor Abarbeitung
>>>     von Code viel Präparierarbeit zu erledigen.
>>
>> Blablabla ... Wieviel belangloses Zeug willst du noch als fragwuwerdige
>> Argumente anfuehren, um fuer deine Loesunbg eine hoehere Performance
>> herbeizuluegen? Je komplexer die zu bearbeitende Verzeichnis-Struktur,
>> desto mehr kommt deine Loesung ins Hintertreffen.
> 
> Ich behaupte doch gar keine höhere Performance für meine Lösung!
> Dein Einzeiler wird wohl schneller sein.
> Aber angesichts dieser Diskussion werde ich testen.
> 
> Nein, Du hattest meine Lösung performance-mäßig total runtergemacht.
> Nur diese Behauptung will ich geraderücken.
> 
> Und belangloses Zeug ist die Präparierarbeit von Shells gewiß nicht.


"Aber angesichts dieser Diskussion werde ich testen."

--------------------------------------------------------------------
414]  /usr/bin/time -h sh tt.sh
         0.98s real              0.30s user              0.78s sys
         0.07s real              0.02s user              0.03s sys

418]  /usr/bin/time -h sh tt1.sh
         1.22s real              0.46s user              0.80s sys
         0.10s real              0.00s user              0.07s sys
419]
--------------------------------------------------------------------

Dein Einzeiler (tt1.sh) ist also erkennbar langsamer.
Ich bin also tatsächlich ein Performance-Spezialist.

Die kleinen Werte sind für wesentlich weniger Dateien.



-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10536

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-13 00:48 +0200
Message-ID<pnc54h$prm$1@solani.org>
In reply to#10512
On 09/10/2018 00:23, Helmut Schellong wrote:
> On 09/09/2018 23:46, Helmut Schellong wrote:
>> On 09/09/2018 23:08, Juergen Ilse wrote:

> "Aber angesichts dieser Diskussion werde ich testen."
> 
> --------------------------------------------------------------------
> 414]  /usr/bin/time -h sh tt.sh
>          0.98s real              0.30s user              0.78s sys
>          0.07s real              0.02s user              0.03s sys
> 
> 418]  /usr/bin/time -h sh tt1.sh
>          1.22s real              0.46s user              0.80s sys
>          0.10s real              0.00s user              0.07s sys
> 419]
> --------------------------------------------------------------------
> 
> Dein Einzeiler (tt1.sh) ist also erkennbar langsamer.
> Ich bin also tatsächlich ein Performance-Spezialist.
> 
> Die kleinen Werte sind für wesentlich weniger Dateien.

Alle Tests mit 2×3×100 = 600 Dateien.

Einzeiler:  1.22s real              0.46s user              0.80s sys

/usr/bin/time -h /u/bsh/a.out tt.bish
bish:       0.05s real              0.00s user              0.04s sys

bish ist also etwa 24.4-mal schneller.

Obwohl das eine ultimative Lösung ist, mit '\0' als Trenner
und beliebig vielen möglichen Translate-Chars
per tabtabtab... (Kommando conv -O/...):
============================================================
Rename()  {
    local n:03 t:03 Z:.200 Y:.200

    list -Rdf0 . | {
       while readl -0 Z
       do
          conv -c/ Z || continue
	 t=$.  [ t -gt n ] && n=$t
       done
       while [ n -gt 0 ]
       do
          seek 0 0
          while readl -0 Z Y
          do
	    [ -e "$Z" ] || continue
             conv -c/ Z || continue
	    t=$.  [ t -lt n ] && continue
             conv -O/"$n"t' _' Y
             move "$Z" "$Y"
          done
          let --n
       done
    }
}

Rename
============================================================
Da lohnt sich ein Menü dazu.


-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10541

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-14 20:14 +0200
Message-ID<pngtqu$ukg$1@solani.org>
In reply to#10536
On 09/13/2018 00:48, Helmut Schellong wrote:
> On 09/10/2018 00:23, Helmut Schellong wrote:
>> On 09/09/2018 23:46, Helmut Schellong wrote:
>>> On 09/09/2018 23:08, Juergen Ilse wrote:
> 
>> "Aber angesichts dieser Diskussion werde ich testen."
>>
>> --------------------------------------------------------------------
>> 414]  /usr/bin/time -h sh tt.sh
>>          0.98s real              0.30s user              0.78s sys
>>          0.07s real              0.02s user              0.03s sys
>>
>> 418]  /usr/bin/time -h sh tt1.sh
>>          1.22s real              0.46s user              0.80s sys
>>          0.10s real              0.00s user              0.07s sys
>> 419]
>> --------------------------------------------------------------------
>>
>> Dein Einzeiler (tt1.sh) ist also erkennbar langsamer.
>> Ich bin also tatsächlich ein Performance-Spezialist.
>>
>> Die kleinen Werte sind für wesentlich weniger Dateien.
> 
> Alle Tests mit 2×3×100 = 600 Dateien.
> 
> Einzeiler:  1.22s real              0.46s user              0.80s sys
> 
> /usr/bin/time -h /u/bsh/a.out tt.bish
> bish:       0.05s real              0.00s user              0.04s sys
> 
> bish ist also etwa 24.4-mal schneller.
> 
> Obwohl das eine ultimative Lösung ist, mit '\0' als Trenner
> und beliebig vielen möglichen Translate-Chars
> per tabtabtab... (Kommando conv -O/...):
> ============================================================
> Rename()  {
>     local n:03 t:03 Z:.200 Y:.200
> 
>     list -Rdf0 . | {
>        while readl -0 Z
>        do
>           conv -c/ Z || continue
>           t=$.  [ t -gt n ] && n=$t
>        done
>        while [ n -gt 0 ]
>        do
>           seek 0 0
>           while readl -0 Z Y
>           do
>              [ -e "$Z" ] || continue
>              conv -c/ Z || continue
>              t=$.  [ t -lt n ] && continue
>              conv -O/$n't _' Y
>              move "$Z" "$Y"
>           done
>           let --n
>        done
>     }
> }
> 
> Rename
> ============================================================
> Da lohnt sich ein Menü dazu.

Im Zusammenhang mit vorstehendem bish-Code habe ich zwei
Fehler in bish entdeckt.
Den ersten Fehler (Option 'list -0') habe ich in d.c.l.c erklärt.

Der zweite Fehler ist eine Kategorie höher:
------------------------
#  n=000
#  echo ${n}'t _'
000t _
#  n=00
#  echo ${n}'t _'
00
#  n=000
#  echo ${n}'t _'
000t _
#  n=00
#  echo ${n}'t _'
00
#  echo $n't _'
00t _
#  n=0000
#  echo ${n}'t _'
0000t _
#  n=000
#  echo ${n}'t _'
000
#  echo $n't _'
000t _
------------------------
Wenn »${n}« verwendet wird und »n« gegenüber (dem Anlegen
mit) Initialisierung (n=000) _verkürzt_ wird, wird das Argument
zu »echo« hinter dem Inhalt von »n« abgeschnitten!
Ohne »{}« funktioniert es immer.
Mit »{}« aber ohne Verkürzung funktioniert es immer.

Diese Fehler sind/waren echte Bugs, denn sie verstoßen gegen
die Spezifikationen zur 'bish'.


-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10550

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-18 13:12 +0200
Message-ID<pnqmip$otc$1@solani.org>
In reply to#10541
On 09/14/2018 20:14, Helmut Schellong wrote:
>> [...]
> 
> Im Zusammenhang mit vorstehendem bish-Code habe ich zwei
> Fehler in bish entdeckt.
> Den ersten Fehler (Option 'list -0') habe ich in d.c.l.c erklärt.
> 
> Der zweite Fehler ist eine Kategorie höher:
> ------------------------
> #  n=000
> #  echo ${n}'t _'
> 000t _
> #  n=00
> #  echo ${n}'t _'
> 00
> #  n=000
> #  echo ${n}'t _'
> 000t _
> #  n=00
> #  echo ${n}'t _'
> 00
> #  echo $n't _'
> 00t _
> #  n=0000
> #  echo ${n}'t _'
> 0000t _
> #  n=000
> #  echo ${n}'t _'
> 000
> #  echo $n't _'
> 000t _
> ------------------------
> Wenn »${n}« verwendet wird und »n« gegenüber (dem Anlegen
> mit) Initialisierung (n=000) _verkürzt_ wird, wird das Argument
> zu »echo« hinter dem Inhalt von »n« abgeschnitten!
> Ohne »{}« funktioniert es immer.
> Mit »{}« aber ohne Verkürzung funktioniert es immer.
> 
> Diese Fehler sind/waren echte Bugs, denn sie verstoßen gegen
> die Spezifikationen zur 'bish'.

Den zweiten Fehler hatte ich jahrelang nicht bemerkt, weil ich
'${name}' jahrelang nicht brauchte, wegen "$n"'t _' und ähnlich.

Das Argument wurde abgeschnitten, weil nach Verkürzung des Inhalts
'xxx0'  -->  'xx00'  vorlag und beide Male Länge 3 gemeldet wurde.
Korrekt ist Länge 2 im zweiten Fall.

Ich habe nun nachgeforscht und subtile und seltsame
Fehlererscheinungen bei einem vielgenutzten Skript
aus der Erinnerung bemerkt.
Eine Analyse ergab, daß dieser 'zweite' Fehler hochwahrscheinlich
Ursache für die Fehlererscheinungen war.

Aufgabe des Skriptes: siehe unten
Fehlerrelevanter Code:
-----------------------------------------------------------------------
#von bis loeschen halten

vb)  GetIDs vb $1 $( MkNs $* ) | { nop && pop3 - $IP "$User" "$Pass"; }

#GetIDs():

< "$Tmp"       #n sz id t subj addr
case "$1" in
vb)  lh=$2; shift 2
      while read n - id - - -
      do
         if [ $lh = l ]
         then expr " $* " :: "[ \t]${n}[ \t]" && r=0 catv id /\n
         else expr " $* " :: "[ \t]${n}[ \t]" || r=0 catv id /\n
         fi
      done
;;
-----------------------------------------------------------------------
${n} ist notwendig, da andernfalls $n[] als Array erkannt würde.
'n' ist eine fortlaufende Nummer aus einer Datei.
Verglichen wird z.B.:  " 4 6 17 21 "  mit  " 1 "
Der Fehler bewirkte :  " 4 6 17 21 "  mit  " 1"
Es wurden also manchmal(!) maximal 2 zusätzliche eMails gehalten, die
aber nicht zum Halten angegeben waren.

Ich konnte die Fehlerursache im letzten Jahr trotz mehrerer Stunden
Bemühungen nicht finden.
Aber nun, wegen des Skripts für die Dateinamen mit Leerzeichen, bin
ich drauf gekommen.
Der Fehler kam hinein, wegen neu:  ${:name) ${@name}

Dies ist jedenfalls der interessanteste Fehler, den ich je hatte.


Skript:
-----------------------------------------------------------------------
+OK POP server ready H miue15
USER var@schellong.biz
+OK password required for user "var@schellong.biz"
PASS konvolun
+OK mailbox "var@schellong.biz" has 6 messages (317751 octets) H miue15
STAT
+OK 6 317751
UIDL
+OK
1 0M4nb7-1fcJTQ1Wl3-00ywqC
DELE 1
+OK
2 0ME6BD-1g2AFS21st-00HMWu
DELE 2
+OK
3 0MQWOC-1gEBOV0lmG-00TpGk
DELE 3
+OK
4 0LuUHw-1fbkNf4048-00zrHg
5 0M2lXy-1fm8qO0un8-00sfBq
DELE 5
+OK
6 1MI61B-1fzejW03fz-00F8yC
QUIT
+OK POP server signing off
_____________________________________________________________________
    212.45.15.178  pop.de  var@schellong.biz 'sab'  n=? b=? t=?  q=1
    Info-Liste holen :  i | I
            Loeschen :  l  {n|v-b}... | * | tHM- | {min.max|min.|.max}
              Halten :  h  {n|v-b}... |     tHM- | {min.max|min.|.max}
             Beenden :  E
                        E
-----------------------------------------------------------------------



-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10502

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-09 11:05 +0200
Message-ID<pn2nnv$57a$1@solani.org>
In reply to#10495
On 09/08/2018 23:07, Helmut Schellong wrote:
> On 09/08/2018 17:49, Michael Wagner wrote:
>> * 08.09.2018 Helmut Schellong <rip@schellong.biz> wrote:
> 
>>> $(echo "$i" | tr ' ' '_')
>>
>> Hast du das ausprobiert?
> 
> Ich hab es jetzt voll getestet.
> 
> Geht auch mit sh:
> -----------------------------------------------------
> ...
>     for i in $(find . -type d -type f -depth $d)
> ...
> -----------------------------------------------------

      -type d -type f
ist natürlich falsch, weil logisch UND.
      '(' -type d -o -type f ')'
muß es sein.

      -type d,f
funktionierte bei mir nicht - ohne Fehlermeldung.
Da hatte ich es ganz ohne -type getestet.


-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10479

FromJuergen Ilse <news@usenet-verwaltung.de>
Date2018-09-08 12:30 +0000
Message-ID<5b93c0ea$0$7949$7b62cf90@news1.net.de>
In reply to#10475
Hallo,

Helmut Schellong <rip@schellong.biz> wrote:
> On 09/08/2018 12:02, Michael Wagner wrote:
>> Hallo zusammen,
>> 
>> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
>> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
>> umwandeln. Bis jetzt habe ich es so versucht:
>> 
>> for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done
>> 
>> Aber er stoert sich an den Leerzeichen
>> 
>> Nach dem Lesen eines anderen Threads hier habe ich noch folgendes
>> ausprobiert.
>> [...]
> 
> "$(echo ....."
> 
> Also "" hinzufügen, würde ich als nächsten Schritt machen.

... was ebenfalls nicht funktioniert ... Ich ueberlasse es dir selbst,
ueber den Grund dafuer zu meditieren ...

Tschuess,
	Juergen Ilse			(juergen@usenet-verwaltung.de)

[toc] | [prev] | [next] | [standalone]


#10477

FromJuergen Ilse <news@usenet-verwaltung.de>
Date2018-09-08 12:24 +0000
Message-ID<5b93bf7f$0$7949$7b62cf90@news1.net.de>
In reply to#10473
Hallo,

Michael Wagner <wagner_m_bremen@web.de> wrote:
> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
> umwandeln. Bis jetzt habe ich es so versucht:
> 
> for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done
> 
> Aber er stoert sich an den Leerzeichen
 
Logischerweise, weil die Auswertung durrch die shell den Parameter mit
Leerzeichen dann nochmal dem "word-splitting" unterzieht und somit in
2 Paremer zerlegt ... Um das zu vermeiden, koennte man find mit "-exec"
fuer das umbenennen verwenden, nur muss man sich dann Gedanken machen,
wie denn der Befehl fuer das umbennen lauten kann, und man sollte "-depth"
mit angeben, damit die "tiefer liegenden" Verzeichnisse und Dateien zuerst
bearbeitet werden. Probier es z.B. mal mit diesem Vorschlag:

	find . -depth -name 'test *' -exec bash -c 'f="{}"; mv "$f" "${f%\ *}_${f##*\ }"' \;

> Kann mich hier jemand in die richtige Richtung schubsen?

Ich hoffe das getan zu haben ... Uebrigens ist hier "brace expansion" mit
"${f//}" IMHO nicht verwendebar, weil es das "falsche" Leerzeichen zuerst i
ersetzen wuerde (deswegen das relativ aufwendige Kostrukt 
"${f%\ *}_${ f##*\ }" zum erzeugen des "richtigen" Zieldateinamens, bei dem
erst einmal nur das letzte Leerzeichen im Namen ersetzt wird).

Tschuess,
	Juergen Ilse			(juergen@usenet-verwaltung.de)

[toc] | [prev] | [next] | [standalone]


#10480

FromMichael Wagner <wagner_m_bremen@web.de>
Date2018-09-08 13:08 +0000
Message-ID<pn0hk5$df6$2@news.albasani.net>
In reply to#10477
* 08.09.2018 Juergen Ilse <news@usenet-verwaltung.de> wrote:
> Hallo,
>
> Michael Wagner <wagner_m_bremen@web.de> wrote:
>> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
>> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
>> umwandeln. Bis jetzt habe ich es so versucht:
>> 
>> for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done
>> 
>> Aber er stoert sich an den Leerzeichen
>  
> Logischerweise, weil die Auswertung durrch die shell den Parameter mit
> Leerzeichen dann nochmal dem "word-splitting" unterzieht und somit in
> 2 Paremer zerlegt ... Um das zu vermeiden, koennte man find mit "-exec"
> fuer das umbenennen verwenden, nur muss man sich dann Gedanken machen,
> wie denn der Befehl fuer das umbennen lauten kann, und man sollte "-depth"
> mit angeben, damit die "tiefer liegenden" Verzeichnisse und Dateien zuerst
> bearbeitet werden. Probier es z.B. mal mit diesem Vorschlag:
>
> 	find . -depth -name 'test *' -exec bash -c 'f="{}"; mv "$f" "${f%\ *}_${f##*\ }"' \;

Hallo Jürgen,

das hat funktioniert. Das mit dem Konstrukt ${f%\ *}_${f##*\ } muss ich
mir nochmal genauer ansehen.

Danke dir Michael

-- 
Anruf bei der Hotline: "Ich installiere gerade Windows Vista. Was soll
           ich drücken?" Antwort: "Am besten beide Daumen!"

[toc] | [prev] | [next] | [standalone]


#10498

FromHelmut Waitzmann <nn.throttle@xoxy.net>
Date2018-09-09 03:04 +0200
Message-ID<87h8izeb0i.fsf@helmutwaitzmann.news.arcor.de>
In reply to#10477
Juergen Ilse <news@usenet-verwaltung.de>:
>Michael Wagner <wagner_m_bremen@web.de> wrote:

>	find . -depth -name 'test *' -exec bash -c \
>         'f="{}"; mv "$f" "${f%\ *}_${f##*\ }"' \;

Vorsicht!

„find ... -exec bash -c 'f="{}"; ...' \;“

fällt böse auf die Schnauze, wenn der gefundene Dateiname
Anführungszeichen enthält.  Mit „böse“ meine ich, dass es nicht
nur scheitert, sondern je nach Dateiname buchstäblich alles
mögliche, was das Betriebssystem dem Aufrufer erlaubt, passieren
kann, einschließlich Datenverlust.

Um das zu vermeiden, hilft

„find ... -exec sh -c -- 'f="$1"; ...' sh '{}' \;“.

(Statt „sh“ kann man auch „bash“ nehmen.)

-- 
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.

[toc] | [prev] | [next] | [standalone]


#10500

FromHelmut Waitzmann <nn.throttle@xoxy.net>
Date2018-09-09 10:01 +0200
Message-ID<87h8izcd4q.fsf@helmutwaitzmann.news.arcor.de>
In reply to#10473
Michael Wagner <wagner_m_bremen@web.de>:

>ich will in einem Verzeichnis, in dem sich viele
>Unterverzeichnisse und Dateien mit Leerzeichen befinden, das
>Leerzeichen in einen Unterstrich umwandeln.

Ich nehme an, Du willst alle Leerzeichen umwandeln, auch wenn es
mehrere in einem Dateinamen sind.

>Bis jetzt habe ich es so versucht:
>
>for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done

„for i in $(find ...)“  funktioniert nur bei „schönem Wetter“.  In
Deinem Fall herrscht Platzregen:

>Aber er stoert sich an den Leerzeichen

find . -depth \( -type d -o -type f \) -name '* *' \
  -exec sh -cu -- \
  'basename="${1##*/}" && dirname="${1%"$basename"}" &&
   basename_neu="$(printf %s. "$basename" | tr -- " " _)" &&
   basename_neu="${basename_neu%.}" &&
   neu="${dirname}${basename_neu}" &&
   if test -L "${neu}" || test -e "${neu}"
   then
     {
       printf \
         '\''Kann\n%s\nnicht nach\n%s\nbewegen:\n%s\nexistiert\n'\'' \
         "$1" "${neu}" "${neu}" &&
       printf %s\\n \
         '\''Hier ist ein Shell mit den Parametern'\'' \
         "$dirname" "$basename" "$basename_neu" \
         "$1" "$neu" &&
       (
         cd "$dirname" &&
         ls -ld -- "$basename" "$basename_neu"
       ) &&
     } >&2 &&
     "$SHELL" -si -- "$dirname" "$basename" "$basename_neu" \
       "$1" "$neu"
   else
     mv -i -- "$1" "${neu}"
   fi
  ' sh \{\} \;

Dabei wird im Fall einer Kollision (neuer Name ist bereits
vorhanden) ein "$SHELL" gestartet, der als Parameter den Pfadnamen
des Verzeichnisses, in dem die Kollision liegt, die Dateinamen
ohne Verzeichskomponenten des alten und neuen Pfadnamens und die
kompletten alten und neuen Pfadnamen in den positional parameters
"$1" bis "$5" hat.  Darin kannst Du irgendwelche Kommandos
aufrufen, um das Problem von Hand zu lösen.  Beendet wird es mit
„exit“.  Dann geht die Suche weiter zur nächsten Datei.

Angenommen, es wird eine Kollision bei

./'ein Verzeichnis'/'eine Datei'

gefunden, dann erhält der "$SHELL" die Parameter

$1=./'ein Verzeichnis'/
$2='eine Datei'
$3='eine_Datei'
$4=./'ein Verzeichnis'/'eine Datei'
$5=./'ein Verzeichnis'/'eine_Datei'

Um die neue Datei – sofern sie kein Verzeichnis ist – einfach
wegzuwerfen, könntest Du im "$SHELL" das Kommando

  mv -f -- "$4" "$5" && exit

eintippen, um die Datei umzubenennen und bei Erfolg den "$SHELL"
zu beenden.

Wenn Du den History‐Mechanismus des Shells nutzt, kannst Du
Tipparbeit bei weiteren Kollisionen sparen.
-- 
Hat man erst verstanden, wie Unix funktioniert, ist auch
das Shell-Handbuch kein Buch mit sieben Siegeln mehr.

[toc] | [prev] | [next] | [standalone]


#10503

FromUlli Horlacher <framstag@rus.uni-stuttgart.de>
Date2018-09-09 09:47 +0000
Message-ID<pn2q6r$pgb$1@news2.informatik.uni-stuttgart.de>
In reply to#10473
Michael Wagner <wagner_m_bremen@web.de> wrote:

> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
> umwandeln.

Das wird mit (ba)sh Bordmittel umstaendlich.
Weil bei mir so was oefters vorkommt, hab ich frename geschrieben, das auf
Larry Walls rename basiert.

Damit geht dann (u.a.):

frename -R 's/ /_/g' Verzeichnis

Oder wenn mann dann auch noch gleich Umlaute und den ganzen anderen Mist 
loswerden will:

frename -sR Verzeichnis


http://fex.belwue.de/fstools/#frename


-- 
Ullrich Horlacher              Server und Virtualisierung
Rechenzentrum TIK         
Universitaet Stuttgart         E-Mail: horlacher@tik.uni-stuttgart.de
Allmandring 30a                Tel:    ++49-711-68565868
70569 Stuttgart (Germany)      WWW:    http://www.tik.uni-stuttgart.de/

[toc] | [prev] | [next] | [standalone]


#10507

FromChristian Schneider <strcat@gmx.net>
Date2018-09-09 15:51 +0200
Message-ID<2018-09-09T15-46-48@bofh.my-fqdn.de>
In reply to#10503
Thus spake Ulli Horlacher (framstag@rus.uni-stuttgart.de):
> Michael Wagner <wagner_m_bremen@web.de> wrote:
>
>> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
>> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
>> umwandeln.
>
> Das wird mit (ba)sh Bordmittel umstaendlich.
> Weil bei mir so was oefters vorkommt, hab ich frename geschrieben, das auf
> Larry Walls rename basiert.
>
> Damit geht dann (u.a.):
>
> frename -R 's/ /_/g' Verzeichnis
[..]

Oder man nimmt die Zsh bzw. zmv.
#v+
$ autoload zmv
$ zmv '* *' '$f:gs/ /_'
#v
-- 
{  \|/  ______  \|/ Access denieded |  Christian 'strcat' Schneider }
{  "@' / ,  . \ `@" Nah Nah Nah :p  |  http://www.strcat.de/        }
{  /__| \____/ |__\                 |  http://www.strcat.de/blog/   }
{      \___U__/                     |  http://strcat.de/chris.gpg   }

[toc] | [prev] | [next] | [standalone]


#10504

FromStefan Reuther <stefan.news@arcor.de>
Date2018-09-09 11:39 +0200
Message-ID<pn30p4.2l8.1@stefan.msgid.phost.de>
In reply to#10473
Am 08.09.2018 um 12:02 schrieb Michael Wagner:
> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
> umwandeln. Bis jetzt habe ich es so versucht:
> 
> for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done
> 
> Aber er stoert sich an den Leerzeichen

Vermeide $(...), wenn es um Dateinamen geht. Immer, wo geparsed wird,
stolpert er über irgendwas, Leerzeichen sind nur der Anfang. Was ist mit
Newlines, Backslashes, Quotes?

Bau die Suche und Rekursion selbst. Ist gar nicht schwer:

   replace_space() {
      # Benenne alles um, wo ein Leerzeichen drin ist
      # Mit '-i', dass nicht versehentlich was überschrieben wird
      for i in "$1"/*" "*; do
         mv -i "$i" "${i// /_}"
      done

      # Rekursion
      for i in "$1"/*; do
         test -d "$i" && replace_space "$i"
      done
   }

   replace_space .

Hiermit findet jegliches Zusammenbauen und Auseinandernehmen von
Dateinamen in der Shell statt.

Versteckte Dateien/Verzeichnisse werden in dieser Version ignoriert.
Kann man als Vor- oder Nachteil sehen, die mit reinzunehmen
verkompliziert den Rekursionsschritt etwas.


  Stefan

[toc] | [prev] | [next] | [standalone]


#10506

FromMichael Wagner <wagner_m_bremen@web.de>
Date2018-09-09 14:12 +0200
Message-ID<pn32nd$g9u$1@news.albasani.net>
In reply to#10504
* 09.09.2018 Stefan Reuther <stefan.news@arcor.de> wrote:
> Am 08.09.2018 um 12:02 schrieb Michael Wagner:
>> ich will in einem Verzeichnis, in dem sich viele Unterverzeichnisse und
>> Dateien mit Leerzeichen befinden, das Leerzeichen in einen Unterstrich
>> umwandeln. Bis jetzt habe ich es so versucht:
>> 
>> for i in $(find . -type d,f); do mv "$i" $(echo $i | tr ' ' '_');done
>> 
>> Aber er stoert sich an den Leerzeichen
>
> Vermeide $(...), wenn es um Dateinamen geht. Immer, wo geparsed wird,
> stolpert er über irgendwas, Leerzeichen sind nur der Anfang. Was ist mit
> Newlines, Backslashes, Quotes?
>
> Bau die Suche und Rekursion selbst. Ist gar nicht schwer:
>
>    replace_space() {
>       # Benenne alles um, wo ein Leerzeichen drin ist
>       # Mit '-i', dass nicht versehentlich was überschrieben wird
>       for i in "$1"/*" "*; do
>          mv -i "$i" "${i// /_}"
>       done
>
>       # Rekursion
>       for i in "$1"/*; do
>          test -d "$i" && replace_space "$i"
>       done
>    }
>
>    replace_space .
>
> Hiermit findet jegliches Zusammenbauen und Auseinandernehmen von
> Dateinamen in der Shell statt.

Hallo Stefan,

das ist ja echt ne geile Loesung, die ich auch sofort verstanden habe.
Allerdings klappt das mit dem 'mv -i' nicht so wie ich gedacht habe. Es
wird nicht nachgefragt ob was ueberschrieben werden soll. Is aber nicht
so schlimm, da ich das eh nur gezielt auf bestimmte Verzeichnisse
loslasse.

Dank dir Michael

-- 
Where is Carmen, San Diego?

[toc] | [prev] | [next] | [standalone]


#10521

FromStefan Reuther <stefan.news@arcor.de>
Date2018-09-10 19:17 +0200
Message-ID<pn6g04.gs.1@stefan.msgid.phost.de>
In reply to#10506
Am 09.09.2018 um 14:12 schrieb Michael Wagner:
> * 09.09.2018 Stefan Reuther <stefan.news@arcor.de> wrote:
>>       # Benenne alles um, wo ein Leerzeichen drin ist
>>       # Mit '-i', dass nicht versehentlich was überschrieben wird
>>       for i in "$1"/*" "*; do
>>          mv -i "$i" "${i// /_}"
>>       done
[...]
> das ist ja echt ne geile Loesung, die ich auch sofort verstanden habe.
> Allerdings klappt das mit dem 'mv -i' nicht so wie ich gedacht habe. Es
> wird nicht nachgefragt ob was ueberschrieben werden soll.

Bei mir geht's :-) Er fragt nach, wenn es eine Kollision zweier Dateien
gibt.

   rocket:/tmp/t > find
   .
   ./a b
   ./a b/a 1
   ./a b/a_1
   rocket:/tmp/t > replace_space .
   mv: „./a_b/a_1“ überschreiben? y
   rocket:/tmp/t > find
   .
   ./a_b
   ./a_b/a_1

Das Verzeichnis "a b" wurde kommentarlos nach "a_b" umbenannt, für die
Datei "a 1" wurde nachgefragt. Bei einer Kollision zwischen
Verzeichnissen geht es allerdings in der Tat in die Hose (macht nicht
das gewünschte).

Ich wollte damit vor allem verhindern, dass versehentlich Dateien in den
Orkus geschoben werden, das müsste mit der Lösung ausgeschlossen sein.
Die Dateien stehen halt nur mit etwas Pech hinterher woanders :)


  Stefan

[toc] | [prev] | [next] | [standalone]


#10515

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-10 16:23 +0200
Message-ID<pn5up2$heh$1@solani.org>
In reply to#10504
On 09/09/2018 11:39, Stefan Reuther wrote:

> Bau die Suche und Rekursion selbst. Ist gar nicht schwer:
> 
>     replace_space() {
>        # Benenne alles um, wo ein Leerzeichen drin ist
>        # Mit '-i', dass nicht versehentlich was überschrieben wird
>        for i in "$1"/*" "*; do
>           mv -i "$i" "${i// /_}"
>        done
> 
>        # Rekursion
>        for i in "$1"/*; do
>           test -d "$i" && replace_space "$i"
>        done
>     }
> 
>     replace_space .

Ich hatte mir das auch angesehen.

drwx------  5 root  wheel  512 Sep 10 15:59 test 1
drwx------  5 root  wheel  512 Sep 10 15:59 test 2

402]  echo ./*" "*
./test 1 ./test 2
403]

Da sind jedoch 4 Argumente für 'mv'.
Das paßt nicht.
...


-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10522

FromStefan Reuther <stefan.news@arcor.de>
Date2018-09-10 19:10 +0200
Message-ID<pn6fjr.4p0.1@stefan.msgid.phost.de>
In reply to#10515
Am 10.09.2018 um 16:23 schrieb Helmut Schellong:
> On 09/09/2018 11:39, Stefan Reuther wrote:
> Ich hatte mir das auch angesehen.
> 
> drwx------  5 root  wheel  512 Sep 10 15:59 test 1
> drwx------  5 root  wheel  512 Sep 10 15:59 test 2
> 
> 402]  echo ./*" "*
> ./test 1 ./test 2
> 403]
> 
> Da sind jedoch 4 Argumente für 'mv'.

Nein, sind es nicht. Jedenfalls nicht in einer POSIX-Shell.

rocket:/tmp > touch "test 1" "test 2"
rocket:/tmp > echo ./*" "*
./test 1 ./test 2
rocket:/tmp > set ./*" "*
rocket:/tmp > echo $#
2
rocket:/tmp >


  Stefan

[toc] | [prev] | [next] | [standalone]


#10527

FromHelmut Schellong <rip@schellong.biz>
Date2018-09-11 00:47 +0200
Message-ID<pn6sa3$82v$1@solani.org>
In reply to#10522
On 09/10/2018 19:10, Stefan Reuther wrote:
> Am 10.09.2018 um 16:23 schrieb Helmut Schellong:
>> On 09/09/2018 11:39, Stefan Reuther wrote:
>> Ich hatte mir das auch angesehen.
>>
>> drwx------  5 root  wheel  512 Sep 10 15:59 test 1
>> drwx------  5 root  wheel  512 Sep 10 15:59 test 2
>>
>> 402]  echo ./*" "*
>> ./test 1 ./test 2
>> 403]
>>
>> Da sind jedoch 4 Argumente für 'mv'.
> 
> Nein, sind es nicht. Jedenfalls nicht in einer POSIX-Shell.

Stimmt:

430]  bsh -E
1#  echo ab*
abc   de
2#

sogar in bsh.


-- 
Mit freundlichen Grüßen
Helmut Schellong   var@schellong.biz
www.schellong.de   www.schellong.com   www.schellong.biz
http://www.schellong.de/c.htm

[toc] | [prev] | [next] | [standalone]


#10516

FromChristoph 'Mehdorn' Weber <spam-fuer@das-mehdorn.de>
Date2018-09-10 16:21 +0200
Message-ID<slrnppcvg1.6eo.spam-fuer@judy.das-mehdorn.de.vu>
In reply to#10504
Hallo!

* Stefan Reuther <stefan.news@arcor.de>:

> Vermeide $(...), wenn es um Dateinamen geht. Immer, wo geparsed wird,
> stolpert er über irgendwas, Leerzeichen sind nur der Anfang. Was ist mit
> Newlines, Backslashes, Quotes?

  Führende Bindestriche könnten noch stören, daher ...

>       for i in "$1"/*" "*; do
>          mv -i "$i" "${i// /_}"
>       done

  ... wahlweise "mv -i --" benutzen oder sicherheitshalber jeweils
"./" vor den Dateinamen packen.


  Aber im Allgemeinen benutze ich einfach "detox" für Automatismen
oder "qmv -f do" interaktiv.

Christoph

-- 
Was meinst Du, wie recovery es ist, zweimal mit dem Finger um die
Krempe einer Melone zu streichen und zweimal auf dieselbe zu tippen,
um den naechsten Marketing-Strategen ist einen Frosch zu verwandeln?
Es muss der richtige Hut sein. (Roger Schwentker)

[toc] | [prev] | [next] | [standalone]


#10520

FromStefan Reuther <stefan.news@arcor.de>
Date2018-09-10 19:19 +0200
Message-ID<pn6g3n.gs.1@stefan.msgid.phost.de>
In reply to#10516
Am 10.09.2018 um 16:21 schrieb Christoph 'Mehdorn' Weber:
> * Stefan Reuther <stefan.news@arcor.de>:
>> Vermeide $(...), wenn es um Dateinamen geht. Immer, wo geparsed wird,
>> stolpert er über irgendwas, Leerzeichen sind nur der Anfang. Was ist mit
>> Newlines, Backslashes, Quotes?
> 
>   Führende Bindestriche könnten noch stören, daher ...
> 
>>       for i in "$1"/*" "*; do
>>          mv -i "$i" "${i// /_}"
>>       done
> 
>   ... wahlweise "mv -i --" benutzen oder sicherheitshalber jeweils
> "./" vor den Dateinamen packen.

Im konkreten Fall beginnt $i immer mit dem, was der Funktion als
Parameter übergeben wurde, was hoffentlich kein '-' am Anfang hat, so
dass das nicht ungewollt auftritt, ohne dass jemand stutzig wird.

Aber im allgemeinen Fall hast du recht.


  Stefan

[toc] | [prev] | [next] | [standalone]


Page 2 of 3 — ← Prev page 1 [2] 3  Next page →

Back to top | Article view | de.comp.os.unix.shell


csiph-web