Fehler in Dateinamen (öäü...)

Hi Gemeinde,

Im Zuge der Realisierung meines ht://Dig Projectes (Posting von gestern) anhand der Vorschläge von 2 netten Usern (nochmals Dank) ergab sich ein neues Problem:

Ich habe Datei-Namen, die Probleme verursachen. Beispiel:

Richtiger Name:
Win95 löscht Athlon BIOS.txt

So zeigt es ls
Win95 l?scht Athlon BIOS.txt

So erscheint es nach ‚find . -exec echo ‚…‘ ; >test.html‘ in der test.html Datei:
Win95 l"scht Athlon BIOS.txt

Die Namens-Fehler stammen vermutlich aus der Zeit, als ich noch Samba ohne ISO8859-1 Lokalisierung laufen hatte. Teilweise kommt das aber immer noch vor, wenn ich Files von CD kopiere. Also wird mich das Problem noch ewig verfolgen…

Wie kann man sowas effektiv korrigieren???

gruss, Le- macht Linux denn nie was ich will? -xa

Hi Lexa,

eine Möglichkeit wäre es diese Zeichenfolgen mit tr oder besser sed das ganze wieder zu ändern.Natürlich muss man sich dann noch gedanken machen wie man erkennt wenn ein ? oder " zurecht im Dateinamen ist (Sind das erlaubte Zeichen unter Windows ?)

Ich habe mich allerdings noch nie wirklich mit solch einen Problem beschäftigt.
Ich vermeide nämlich grundsätzlich Sonderzeichen in Dateinamen. (Das soll jetzt nicht ausdrücken das du das auch tun sollst, sondern einfach nur unter mauern das meine Idee nicht gerade durchdacht ist, sondern das sie mir nur spontan eingefallen ist)

in diesem Sinne

polarix

Hallo und Danke polarix…

eine Möglichkeit wäre es diese Zeichenfolgen mit tr oder
besser sed das ganze wieder zu ändern.Natürlich muss man sich
dann noch gedanken machen wie man erkennt wenn ein ? oder "
zurecht im Dateinamen ist (Sind das erlaubte Zeichen unter
Windows ?)

? und * nicht erlaubt (Platzhalter)
" erlaubt (in Linux wohl nicht?)

Gibt es keine Platzhalter in Linux ???

Mir passiert es regelmäßig, dass ein Umbenennen mit angeblichen Platzhaltern zu einem Dateinamen der Art „*.txt“ führt:

mv testfile.asc *.txt

ls

*.txt … na prima???

Sinnig bzw. logisch ist das wohl nicht? Gibt es keine Möglichkeit, alle .asc in .txt umzubenennen?

Der Midnight Commander sträubt sich auch. Er macht dann „testfile.asc.txt“ draus :frowning:(

Ich vermeide nämlich grundsätzlich Sonderzeichen in
Dateinamen. (Das soll jetzt nicht ausdrücken das du das auch
tun sollst,

[…]

Doch doch, ich vermeide es auch. Aber es sind nicht alle Dateien von mir (z.B. Zeitschriften Archiv-CDs).

Nieder mit den Umlauten !!!

Nee, mal ernsthaft:

Angenommen, ich will alle Dateien finden, die seltsame Zeichen im Dateinamen haben, wie müßte das aussehen? Ich habe eben

find . -name ‚*?*‘

probiert. Das ist dasselbe Ergebnis wie ‚find . *‘

Dateien mit „normalen“ Zeichen auszufiltern scheint kein Problem zu sein:

find . -type f ! -name ‚*[A-C]*‘

funzt, wohingegen bei

find . -type f -name ‚*[?]*‘

keine einzige Datei angezeigt wird, obwohl die bash Dateien der Art ‚?berbev?lkerung‘ anzeigt.

Ich schnall’ das nicht, Danke für die Geduld :wink:

  • gruss lexa

Morgen,

eine Möglichkeit wäre es diese Zeichenfolgen mit tr oder
besser sed das ganze wieder zu ändern.Natürlich muss man sich
dann noch gedanken machen wie man erkennt wenn ein ? oder "
zurecht im Dateinamen ist (Sind das erlaubte Zeichen unter
Windows ?)

? und * nicht erlaubt (Platzhalter)
" erlaubt (in Linux wohl nicht?)

Gibt es keine Platzhalter in Linux ???

Doch * und ? zum Beispiel:smile:

Mir passiert es regelmäßig, dass ein Umbenennen mit
angeblichen Platzhaltern zu einem Dateinamen der Art „*.txt“
führt:

mv testfile.asc *.txt

ls

*.txt … na prima???

Sinnig bzw. logisch ist das wohl nicht? Gibt es keine
Möglichkeit, alle .asc in .txt umzubenennen?

hihi :smile: das kann auch nicht klappen. Schau dir mal das tool mmv an das sollte genau das tunen was du magst.
Ansonsten hilft ein konstrukt aus „find“ „basename“ und „mv“.

Nieder mit den Umlauten !!!

ACK!:smile:

Nee, mal ernsthaft:

Angenommen, ich will alle Dateien finden, die seltsame Zeichen
im Dateinamen haben, wie müßte das aussehen? Ich habe eben

find . -name ‚*?*‘

Hmmm… unter normalen Umständen würde ich jetzt sagen.
man bash -> escape
Aber dann würden ja einige behaupten ich habe nicht geholfen.

ein find ./ -name „*?*“ findet alle dateien mit einem ? im Namen.
\ ist der escape character.

find . -type f -name ‚*[?]*‘

Das liegt daran das ? ein Plathalter für eine einziges Zeichen ist.
man regexp könnte dir evtl. helfen. Aber Achtung regular expressions sind recht komplex. IMHO ist ein Buch zu diesem Thema recht hilfreich.

In diesem Sinne

polarbear

Hallo und Danke polarix…

? und * nicht erlaubt (Platzhalter)
" erlaubt (in Linux wohl nicht?)

In Linux kann man so was escapen, da ist alles außer / in Dateinamen erlaubt…

Gibt es keine Platzhalter in Linux ???

Klar, die werden normalerweise von der Shell expandiert. man bash. Funktioniert etwas anders als unter DOS/Windows.
Bevor ein Kommando aufgerufen wird, werden die Platzhalter expandiert.
echo * mal probieren, um zu sehen, was da passiert.

Mir passiert es regelmäßig, dass ein Umbenennen mit
angeblichen Platzhaltern zu einem Dateinamen der Art „*.txt“
führt:

mv testfile.asc *.txt

ls

*.txt … na prima???

Eher komisch, sollte *.txt nicht von der bash vorher expandiert werden ??? „*.txt“ geschrieben ? Davin abgesehen, *.txt ist auch falsch, da dann, falls vorhanden, irgendeine Textdatei überschrieben wird.

Sinnig bzw. logisch ist das wohl nicht? Gibt es keine
Möglichkeit, alle .asc in .txt umzubenennen?

for i in *.asc ; do mv $i $(basename $i .asc).txt ; done

Angenommen, ich will alle Dateien finden, die seltsame Zeichen
im Dateinamen haben, wie müßte das aussehen? Ich habe eben

find . -name ‚*?*‘

find . -name ‚*?*‘
? ohne \ steht für ein beliebiges Zeichen.
Aber nach ? zu suchen wird nicht viel bringen, s.u.

probiert. Das ist dasselbe Ergebnis wie ‚find . *‘

Dateien mit „normalen“ Zeichen auszufiltern scheint kein
Problem zu sein:

find . -type f ! -name ‚*[A-C]*‘

funzt, wohingegen bei

find . -type f -name ‚*[?]*‘

Auch hier:
find . -type f -name ‚*[?]*‘

keine einzige Datei angezeigt wird, obwohl die bash Dateien
der Art ‚?berbev?lkerung‘ anzeigt.

Das kann aber auch an der Bash-Anzeige liegen, da muss kein ? drin sein, evtl. ist es auch ein anderes Sonderzeichen, das die Bash nur als ? anzeigt.
find . -name „*[^_A-Za-z0-9.]*“ sollte alles finden, was Zeichen außer a-z, 0-9, _ und . enthält…

Ich schnall’ das nicht, Danke für die Geduld :wink:

  • gruss lexa

Hallo Alexander,

? und * nicht erlaubt (Platzhalter)
" erlaubt (in Linux wohl nicht?)

Nö würde ich nicht benutzen.

Gibt es keine Platzhalter in Linux ???

Mir passiert es regelmäßig, dass ein Umbenennen mit
angeblichen Platzhaltern zu einem Dateinamen der Art „*.txt“
führt:

mv testfile.asc *.txt

ls

*.txt … na prima???

Sinnig bzw. logisch ist das wohl nicht? Gibt es keine
Möglichkeit, alle .asc in .txt umzubenennen?

for i in ls
do
NEW=echo $i | awk '{gsub("asc","txt"); print $0}'
mv $i $NEW
done

find . -name ‚*?*‘

Du verwendest hier einen regulären Ausdruck in denen das ? eine besondere Bedeutung hat (genau ein Zeichen). Du suchst also nach einer Datei die mit beliebig vielen Zeichen beginnt, dann folgt genau ein Zeichen und dann kommen wieder beliebig viele Zeichen…das wird wohl immer auf jede Datei zutreffen.
Mit "find . -name ‚*?*‘ müsste es klappen. Der \ unterdrückt das ? als regulären Ausdruck.

Dateien mit „normalen“ Zeichen auszufiltern scheint kein
Problem zu sein:

find . -type f ! -name ‚*[A-C]*‘

funzt, wohingegen bei

find . -type f -name ‚*[?]*‘

siehe oben

Grüße
Martin

Vielen Dank vorab an Euch *alle* für die guten Tips!!

Auch wenn mir noch nicht alles restlos klar geworden ist :wink:

Gibt es keine Platzhalter in Linux ???

Klar, die werden normalerweise von der Shell expandiert. man
bash. Funktioniert etwas anders als unter DOS/Windows.
Bevor ein Kommando aufgerufen wird, werden die Platzhalter
expandiert.

Expandiert zum Inhalt des Verzeichnisses, nagut. Gewöhnungssache.

#echo * mal probieren, um zu sehen, was da passiert.

ein unformatiertes ls mit *dem* anschließendem Text kommt dabei raus, ok.

#echo ? mal probieren, um zu sehen, was da passiert.
#? mal probieren, um zu sehen, was da passiert.

Hier wird wohl nix expandiert???

Mir passiert es regelmäßig, dass ein Umbenennen mit
angeblichen Platzhaltern zu einem Dateinamen der Art „*.txt“
führt:

mv testfile.asc *.txt

ls

*.txt … na prima???

Eher komisch, sollte *.txt nicht von der bash vorher
expandiert werden ??? „*.txt“ geschrieben ?

ja, sehr komisch, schon nah an der Grenze zum Unberechenbaren.

Davon abgesehen,
*.txt ist auch falsch, da dann, falls vorhanden, irgendeine
Textdatei überschrieben wird.

klar, das überlegt man sich natürlich vorher :wink:
Das ist Win/Lin/DOS kein Unterschied.

for i in $1 ; do mv $i $(basename $i $1)$2 ; done

Gut. Da kann man sich ja ein kleines Script basteln:

find . -type f -name ‚*[?]*‘

Auch hier:
find . -type f -name ‚*[?]*‘

yup!

Das kann aber auch an der Bash-Anzeige liegen, da muss kein ?
drin sein, evtl. ist es auch ein anderes Sonderzeichen, das
die Bash nur als ? anzeigt.

Ein Bash-Geheimnis??? Wie kriegt man das raus?

find . -name „*[^_A-Za-z0-9.]*“ sollte alles finden, was
Zeichen außer a-z, 0-9, _ und . enthält…

Soweit so gut, das Resultat ist schon sehr brauchbar, ausbaufähig und kommt der Lösung schon sehr nahe…

Hurra!

find . -name ‚*[^~`_#&A-Za-z0-9ÄÖÜäöüß.,;=\ +-()!]*‘ >falschnamen.lst

…uff … aber jetzt kommt’s

Wie bringe ich ihm das „normale“ Hochkomman ( ’ ) bei, welches ja erlaubt ist als Bestandteil des Dateinamens???

Ein

find . -name '*[‚A-Z]*‘

bzw

find . -name '*[‚A-Z]*‘

präsentiert mir einen Eingabeprompt (??)

Soll’s daran scheitern ???

Dieses Problem muss ich der Vollständigkeit halber lösen! Ich hasse halbe Sachen.

Im Übrigen werde ich mir für die ganze Umbenennerei wohl lieber ein kleines Programm schreiben. Das wäre eine Premiere, Mein erster C Code für Linux :smile:))

Oder doch lieber Pascal??

Ich ahne Schlimmes…

  • gruss lexa -

#echo ? mal probieren, um zu sehen, was da passiert.
#? mal probieren, um zu sehen, was da passiert.

Hier wird wohl nix expandiert???

Wenn es keine Datei mit einem Zeichen in deinem Verzeichnis gibt, nicht.

Das kann aber auch an der Bash-Anzeige liegen, da muss kein ?
drin sein, evtl. ist es auch ein anderes Sonderzeichen, das
die Bash nur als ? anzeigt.

Ein Bash-Geheimnis??? Wie kriegt man das raus?

man bash ? Keine Ahnung, ist mir nur auch schon mal aufgefallen.
Hängt wohl irgendwie mit Zeichensatzdefinitionen zusammen.

Wie bringe ich ihm das „normale“ Hochkomman ( ’ ) bei, welches
ja erlaubt ist als Bestandteil des Dateinamens???

Ein

find . -name '*[‚A-Z]*‘

find . -name „*['A-Z]*“
geht.
Bevor die Frage kommt:
find . -name „*[“'A-Z]*"
geht auch *g*

Innherhalb von ‚‘ wird auch der \ zum Quoten nicht berücksichtigt, in „“ schon.

bzw

find . -name '*[‚A-Z]*‘

präsentiert mir einen Eingabeprompt (??)

Soll’s daran scheitern ???

Dieses Problem muss ich der Vollständigkeit halber lösen! Ich
hasse halbe Sachen.

Im Übrigen werde ich mir für die ganze Umbenennerei wohl
lieber ein kleines Programm schreiben. Das wäre eine Premiere,
Mein erster C Code für Linux :smile:))

Oder doch lieber Pascal??

Perl.

Alex