Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.os.unix.shell > #10473 > unrolled thread
| Started by | Michael Wagner <wagner_m_bremen@web.de> |
|---|---|
| First post | 2018-09-08 10:02 +0000 |
| Last post | 2018-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
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 →
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Juergen Ilse <news@usenet-verwaltung.de> |
|---|---|
| Date | 2018-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]
| From | Juergen Ilse <news@usenet-verwaltung.de> |
|---|---|
| Date | 2018-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]
| From | Michael Wagner <wagner_m_bremen@web.de> |
|---|---|
| Date | 2018-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]
| From | Helmut Waitzmann <nn.throttle@xoxy.net> |
|---|---|
| Date | 2018-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]
| From | Helmut Waitzmann <nn.throttle@xoxy.net> |
|---|---|
| Date | 2018-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]
| From | Ulli Horlacher <framstag@rus.uni-stuttgart.de> |
|---|---|
| Date | 2018-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]
| From | Christian Schneider <strcat@gmx.net> |
|---|---|
| Date | 2018-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]
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Date | 2018-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]
| From | Michael Wagner <wagner_m_bremen@web.de> |
|---|---|
| Date | 2018-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]
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Date | 2018-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]
| From | Helmut Schellong <rip@schellong.biz> |
|---|---|
| Date | 2018-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]
| From | Christoph 'Mehdorn' Weber <spam-fuer@das-mehdorn.de> |
|---|---|
| Date | 2018-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]
| From | Stefan Reuther <stefan.news@arcor.de> |
|---|---|
| Date | 2018-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