[OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

View: New views
8 Messages — Rating Filter:   Alert me  

[OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by DIrk Wernien :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Moin Liste,

ich möchte die Datei- und Ordnernamen meiner Musiksammlung
FAT-Kompatibel machen (Für MP3-Player).

Ein

---------------------------------------\/

find ./ -name "*:*" -exec rename 'y/:$/''/' '{}' \;

sollte die Doppelpunkte löschen, ändert aber gar nichts.
Wie sage ich rename, das nicht zu ersetzen ist, sondern zu löschen ist?
Also zu ersetzen durch gar nichts.

Ein
find ./ -name "*:*" -exec rename 'y/:$//' '{}' \;
bringt auch nichts.


find ./ -name "*:*" -exec rename 'y/:$/_/' '{}' \;

ersetzt die Doppelpunkte durch Underscore, ok, das geht, das will ich
aber nicht.
Ich habe auch bemerkt, daß zuerst die Ordnernamen geändert werden und
der Aufruf danach ins Leere läuft, da die Verzeichnisse nun schon die
geänderten Namen tragen - das ist nicht tragisch: ein erneuter Aufruf
erledigt dies dann.


Danke im Voraus und
Tschüss
dirk

--


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by Christian Brabandt :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On Thu, November 5, 2009 6:02 am, DIrk Wernien wrote:

> find ./ -name "*:*" -exec rename 'y/:$/''/' '{}' \;
>
> sollte die Doppelpunkte löschen, ändert aber gar nichts.
> Wie sage ich rename, das nicht zu ersetzen ist, sondern zu löschen ist?
> Also zu ersetzen durch gar nichts.
>
> Ein
> find ./ -name "*:*" -exec rename 'y/:$//' '{}' \;
> bringt auch nichts.
>
>
> find ./ -name "*:*" -exec rename 'y/:$/_/' '{}' \;

Sicher, dass da ein $ nach dem : stehen muß? Das würde doch nur
funktionieren, wenn der : das letzte Zeichen ist, oder? Ich würde mal
ein rename 'y/://' probieren. Aber ich kenne rename auch nicht und rate
jetzt nur.

> Ich habe auch bemerkt, daß zuerst die Ordnernamen geändert werden und
> der Aufruf danach ins Leere läuft, da die Verzeichnisse nun schon die
> geänderten Namen tragen - das ist nicht tragisch: ein erneuter Aufruf
> erledigt dies dann.

man find findet u.a.:

-depth Process each directory's contents before the  directory  itself.
       The -delete action also implies -depth.

regards,
Christian
--
:wq


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by DIrk Wernien :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Am Donnerstag, 5. November 2009 schrieb Christian Brabandt:

> Sicher, dass da ein $ nach dem : stehen muß? Das würde doch nur
> funktionieren, wenn der : das letzte Zeichen ist, oder? Ich würde mal
> ein rename 'y/://' probieren. Aber ich kenne rename auch nicht und
> rate jetzt nur.

Raten hilft nicht weiter - warten (auf einen Perl-Spezialisten) ist wohl
besser   ;-)

find ./ -name "*:*" -exec rename 'y/://' '{}' \;
Nein - leider nicht.

Aber das $ scheint wirklich überflüssig - die Version mit der Ersetzung
durch Underscore läuft auch ohne $.

Die Manpage erklärt auch nicht wirklich etwas:
Das y oder das s am Beginn, wofür ist das gut?

>
> regards,
> Christian
> --
>
> :wq



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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by Christian Brabandt :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hallo DIrk!

DIrk Wernien schrieb am Donnerstag, den 05. November 2009:

> Am Donnerstag, 5. November 2009 schrieb Christian Brabandt:
>
> > Sicher, dass da ein $ nach dem : stehen muß? Das würde doch nur
> > funktionieren, wenn der : das letzte Zeichen ist, oder? Ich würde mal
> > ein rename 'y/://' probieren. Aber ich kenne rename auch nicht und
> > rate jetzt nur.
>
> Raten hilft nicht weiter - warten (auf einen Perl-Spezialisten) ist wohl
> besser   ;-)

Stimmt, also lesen wir mal die Doku (jetzt wird es aber fundiert ;)):

perldoc perlop und suchen nach y\/

,----
| y/SEARCHLIST/REPLACEMENTLIST/cds
|
|     Transliterates all occurrences of the characters found in the search
|     list with the corresponding character in the replacement list.  It
|     returns the number of characters replaced or deleted.  If no string is
|     specified via the =~ or !~ operator, the $_ string is transliterated.
|     (The string specified with =~ must be a scalar variable, an array
|     element, a hash element, or an assignment to one of those, i.e., an
|     lvalue.)
|
|     A character range may be specified with a hyphen, so "tr/A-J/0-9/" does
|     the same replacement as "tr/ACEGIBDFHJ/0246813579/".  For sed devotees,
|     "y" is provided as a synonym for "tr".  If the SEARCHLIST is delimited
|     by bracketing quotes, the REPLACEMENTLIST has its own pair of quotes,
|     which may or may not be bracketing quotes, e.g., "tr[A-Z][a-z]" or
|     "tr(+\-*/)/ABCD/".
|
|     Note that "tr" does not do regular expression character classes such as
|     "\d" or "[:lower:]".  The "tr" operator is not equivalent to the tr(1)
|     utility.  If you want to map strings between lower/upper cases, see "lc"
|     in perlfunc and "uc" in perlfunc, and in general consider using the "s"
|     operator if you need regular expressions.
|
|     Note also that the whole range idea is rather unportable between
|     character sets--and even within character sets they may cause results
|     you probably didn't expect.  A sound principle is to use only ranges
|     that begin from and end at either alphabets of equal case (a-e, A-E), or
|     digits (0-4).  Anything else is unsafe.  If in doubt, spell out the
|     character sets in full.
|
|     Options:
|
|        c   Complement the SEARCHLIST.
|        d   Delete found but unreplaced characters.
|        s   Squash duplicate replaced characters.
|
|     If the "/c" modifier is specified, the SEARCHLIST character set is
|     complemented.  If the "/d" modifier is specified, any characters
|     specified by SEARCHLIST not found in REPLACEMENTLIST are deleted.  (Note
|     that this is slightly more flexible than the behavior of some tr
|     programs, which delete anything they find in the SEARCHLIST, period.) If
|     the "/s" modifier is specified, sequences of characters that were
|     transliterated to the same character are squashed down to a single
|     instance of the character.
`----

also probieren wir jetzt:
find ./ -name "*:*" -exec rename 'y/://d' '{}' \;

Eine Alternative dazu wäre wohl mmv:

while mmv '*:*' '#1#2'; do :; done


> Die Manpage erklärt auch nicht wirklich etwas:
> Das y oder das s am Beginn, wofür ist das gut?

y kommt wohl ursprünglich von sed, wo es dem tr-Befehl entspricht.
s wiederum steht für substitute.

Grüße
Christian
--
:wq


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by DIrk Wernien :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Am Donnerstag, 5. November 2009 schrieb Christian Brabandt:
> Hallo DIrk!

Hallo Christian,

> also probieren wir jetzt:
> find ./ -name "*:*" -exec rename 'y/://d' '{}' \;
>
> Eine Alternative dazu wäre wohl mmv:
>
> while mmv '*:*' '#1#2'; do :; done
>
vielen Dank - das war genau richtig.
:-)

Tschüss
dirk


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by DIrk Wernien :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Moin,
da ist nun noch die Frage wie ich:

'
und
`
escapen/quoten kann?

find ./ -name "*'*" -exec rename -v  'y/'/_/' '{}' \;

geht ins Leere.

Quote and Quote-like Operators
in
perldoc perlop
begreife ich nicht.

Ein q(') geht nicht:

fatter.sh: line 19: syntax error near unexpected token `)'
fatter.sh: line 19: `find ./ -name "*q(')*" -exec
rename -v  'y/q(')/_/' '{}' \;'

Ich steh' wie Ochs' vor'm Berg. Ich kann doch nicht 800 GB per Hand
durchflöhen. Der Rest funktioniert prima und ist rasend schnell.
(Ja, ich muß das Teil so oft aufrufen, bis keine Änderungen mehr nötig
sind - das ist aber egal)

Tschüss
dirk

--

Bei Bedarf einfach kopieren - spart das Heraussuchen der ganzen
Sonderzeichen:

fatter.sh:

===SNIP===

echo
echo  Make filenames FAT compatible
echo

# Muster für copy & paste
#find ./ -name "**" -exec rename -v  'y///' '{}' \;
#find ./ -name "*:*" -exec rename -v  'y/://d' '{}' \;

# verbose
# -v

echo Satzzeichen + Auslassungen
find ./ -name "*:*" -exec rename -v  'y/://d' '{}' \;
find ./ -name "*?*" -exec rename -v  'y/?//d' '{}' \;
find ./ -name "*¿*" -exec rename -v  'y/¿//d' '{}' \;
find ./ -name "*;*" -exec rename -v  'y/;/_/' '{}' \;
find ./ -name "*,*" -exec rename -v  'y/,/_/' '{}' \;
find ./ -name "*&*" -exec rename -v  'y/&/And/' '{}' \;
#find ./ -name "*q(')*" -exec rename -v  'y/q(')/_/' '{}' \;
echo Klammern
find ./ -name "*(*" -exec rename -v  'y/(/-/' '{}' \;
find ./ -name "*)*" -exec rename -v  'y/)/-/' '{}' \;
find ./ -name "*[*" -exec rename -v  'y/[/-/' '{}' \;
find ./ -name "*]*" -exec rename -v  'y/]/-/' '{}' \;
find ./ -name "*{*" -exec rename -v  'y/{/-/' '{}' \;
find ./ -name "*}*" -exec rename -v  'y/}/-/' '{}' \;
echo  Deutsche Sonderzeichen
find ./ -name "*ä*" -exec rename -v  'y/ä/ae/' '{}' \;
find ./ -name "*Ä*" -exec rename -v  'y/Ä/Ae/' '{}' \;
find ./ -name "*ö*" -exec rename -v  'y/ö/oe/' '{}' \;
find ./ -name "*Ö*" -exec rename -v  'y/Ö/Oe/' '{}' \;
find ./ -name "*ü*" -exec rename -v  'y/ü/ue/' '{}' \;
find ./ -name "*Ü*" -exec rename -v  'y/Ü/Ue/' '{}' \;
find ./ -name "*ß*" -exec rename -v  'y/ß/ss/' '{}' \;
echo Sandinavische Sonderzeichen
find ./ -name "*å*" -exec rename -v  'y/å/aa/' '{}' \;
find ./ -name "*Å*" -exec rename -v  'y/Å/Aa/' '{}' \;
find ./ -name "*ø*" -exec rename -v  'y/ø/oe/' '{}' \;
find ./ -name "*Ø*" -exec rename -v  'y/Ø/Oe/' '{}' \;
find ./ -name "*æ*" -exec rename -v  'y/æ/ae/' '{}' \;
find ./ -name "*Æ*" -exec rename -v  'y/Æ/Ae/' '{}' \;
find ./ -name "*ð*" -exec rename -v  'y/ð/d/' '{}' \;
find ./ -name "*Ð*" -exec rename -v  'y/Ð/D/' '{}' \;
echo Südeuropäische Sonderzeichen
find ./ -name "*í*" -exec rename -v  'y/í//' '{}' \;
find ./ -name "*Í*" -exec rename -v  'y/Í//' '{}' \;
find ./ -name "*ñ*" -exec rename -v  'y/ñ//' '{}' \;
find ./ -name "*Ñ*" -exec rename -v  'y/Ñ//' '{}' \;
find ./ -name "*ò*" -exec rename -v  'y/ò//' '{}' \;
find ./ -name "*Ó*" -exec rename -v  'y/Ó//' '{}' \;
find ./ -name "*õ*" -exec rename -v  'y/õ//' '{}' \;
find ./ -name "*Õ*" -exec rename -v  'y/Õ//' '{}' \;
find ./ -name "*â*" -exec rename -v  'y/â/a/' '{}' \;
find ./ -name "*Â*" -exec rename -v  'y/Â/A/' '{}' \;
find ./ -name "*ô*" -exec rename -v  'y/ô/o/' '{}' \;
find ./ -name "*Ô*" -exec rename -v  'y/Ô/O/' '{}' \;
find ./ -name "*û*" -exec rename -v  'y/û/u/' '{}' \;
find ./ -name "*Û*" -exec rename -v  'y/Û/U/' '{}' \;
echo Französische Sonderzeichen
find ./ -name "*à*" -exec rename -v  'y/à/a/' '{}' \;
find ./ -name "*À*" -exec rename -v  'y/À/A/' '{}' \;
find ./ -name "*á*" -exec rename -v  'y/á/a/' '{}' \;
find ./ -name "*Á*" -exec rename -v  'y/Á/A/' '{}' \;
find ./ -name "*ç*" -exec rename -v  'y/ç/c/' '{}' \;
find ./ -name "*Ç*" -exec rename -v  'y/Ç/C/' '{}' \;
find ./ -name "*è*" -exec rename -v  'y/è/e/' '{}' \;
find ./ -name "*È*" -exec rename -v  'y/È/E/' '{}' \;
find ./ -name "*é*" -exec rename -v  'y/é/e/' '{}' \;
find ./ -name "*É*" -exec rename -v  'y/É/E/' '{}' \;
find ./ -name "*ê*" -exec rename -v  'y/ê/e/' '{}' \;
find ./ -name "*Ê*" -exec rename -v  'y/Ê/E/' '{}' \;

===SNIP===


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


Re: [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by Christoph Conrad :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hi dirk,

> ' und ` escapen/quoten kann?

Mit backslash, nehme ich an.

Freundliche Grüße,
Christoph


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)


[SOLVED] [OT] perlexpr : Rekursive Entfernung einzelner Zeichen aus Datei- und Ordnernamen mit find & rename

by DIrk Wernien :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Am Samstag, 7. November 2009 schrieb DIrk Wernien:
> Moin,
> da ist nun noch die Frage wie ich:
>
> '
> und
> `
> escapen/quoten kann?

Am Sonntag, 8. November 2009 schrieb Christoph Conrad:

> Hallo dirk,
>
> So klappt es, als Beispiel:
>
> cc@~/tmp> touch "jjj'kkk"
> cc@~/tmp> find ./ -name "*'*"
> ./jjj'kkk
> cc@~/tmp> find ./ -name "*'*" -exec rename -v  "y/'/_/" '{}' \;
> ./jjj'kkk renamed as ./jjj_kkk
>
> Freundliche Grüße,
> Christoph

Vielen Dank
dirk

--


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

Zum AUSTRAGEN schicken Sie eine Mail an debian-user-german-REQUEST@...
mit dem Subject "unsubscribe". Probleme? Mail an listmaster@... (engl)