Schell script um Dateien umzubenennnen?

kasy

Rouge
Hi,
bräuchte ein Shell Script, was alle / in einem Dateinamen zu einem | umwandelt.
habe mit Shell scripten noch nicht so viel gemacht, und ich hab das Problem das ich die Dateien mit / nicht auf unseren Server spielen kann.

oder gibt es da evtl ne andere möglichkeit?

Server:
freeBSD 4.9 STABLE

Clients:
3 x Mac OS-X 10.3 Panther
2 x MS Windoof XP

Hoffe jemand hat ne idee
Thore
 
vieleicht kann windows das ja - man weis ja nie :D
aber kannst du auf die dateien mit macosx zugreifen?
unter *x stellen "/" und "|" auf jeden fall eine schlechte wahl dar.
 
dagnu schrieb:
vieleicht kann windows das ja - man weis ja nie :D
aber kannst du auf die dateien mit macosx zugreifen?
unter *x stellen "/" und "|" auf jeden fall eine schlechte wahl dar.


Mal von dieser (s.o.) Problematik abgesehen, müßte es mit einem Shell-Script (Bourne-Shell) prinzipiell in etwa so gehen:

#!/bin/sh

for oldFileName in $@; do
newFileName="`echo $oldFileName | sed s/\//\|/g`"
mv $oldFileName $newFileName
done

Aufruf: renameFiles.sh <meine Dateien>

Damit es auch rekursiv funktioniert, könnte es folgendermaßen erweitert werden:

#!/bin/sh

for oldFileName in $@; do
if [ -d $oldFileName ]; then
renameFiles.sh $oldFileName/*
fi
newFileName="`echo $oldFileName | sed s/\//\|/g`"
mv $oldFileName $newFileName
done

Aufruf: wie oben

Für <meine Dateien> gibst Du eine Auswahl aus dem Dateisystem an, also z.B. /* für alles.

Man könnte statt
for oldFileName in $@; do
auch
for oldFileName in $(ls); do
schreiben und sich den Aufrufparameter sparen. Die Rekursion im erweiterten Script müßte dann aber noch angepaßt werden.
 
Argh, bitte nicht. Dein Skript zerstoert alles was irgendwie nach Sonderzeichen aussieht. Fuer gewoehnlich nimmt man find|xargs fuer sowas, aber nicht 'mv *'
 
MrFixit schrieb:
Argh, bitte nicht. Dein Skript zerstoert alles was irgendwie nach Sonderzeichen aussieht. Fuer gewoehnlich nimmt man find|xargs fuer sowas, aber nicht 'mv *'

Möglicherweise ist das Script nicht optimal, okay.

Aber was ich nicht verstehe ist, wieso "mv" nicht im Spiel sein darf. Müssen die Dateien nicht umbenannt werden, um die "/" herauszubekommen ? Dazu nimmt man doch normalerweise "mv", oder irre ich da ?

Und "xargs" für sich macht doch erstmal nichts, als die Argumente einzusammeln und an ein anderes Programm/einen anderen Befehl weiterzureichen wenn ich das richtig verstanden habe.

Wie sähe denn Deine Lösung aus ?
 
Ich schrieb ja auch 'mv *' und nicht mv(1). Natuerlich braucht man zum Umbenennen mv(1), aber man sollte die Shell-Expansion aussen vor lassen. (vor allem for foo in <liste.)
 
Ok, danke für die antworten
Kann mir jemand zeigen, wie ich einen Dateinamen mit '/' erzeugen kann?
nen Dateinamen mit nem / bekommen komische Setzer auf OS9 hin, und das in ganzen 22.000 Datein ^^
aber kannst du auf die dateien mit macosx zugreifen?
Ja mit OS-X soweit kein problem, kanns halt nur nicht auf den Fileserver spielen...
Argh, bitte nicht. Dein Skript zerstoert alles was irgendwie nach Sonderzeichen aussieht. Fuer gewoehnlich nimmt man find|xargs fuer sowas, aber nicht 'mv *'
kannst du mir das mit find|xargs mal bitte ausführlicher schreiben? weil ich will die datein ja schließlich nicht mit der Hand umbenennen :)
 
MrFixit schrieb:
Kann mir jemand zeigen, wie ich einen Dateinamen mit '/' erzeugen kann?

Ist das überhaupt zulässig? Wenn ich unter MacOS (z.B. TextEdit) eine Datei mit einem '/' erzeuge wird die im Filesystem mit einem ':'angezeigt.

ls -al test\:bla.txt
-rw-r--r-- 1 roland roland 3 27 Oct 23:03 test:bla.txt

und ein touch bla\:fasel.txt zeigt auf meinem Desktop wieder ein bla/fasel.txt an. MacOS maskiert also nur.
 
ja, unter OS-X erzeugen geht nicht, aber unter OS-9 erzeugen, OS-X Installieren und die alte Festplatte einbauen... schon hat man son Problem... :)
 
kleiner Lösungsansatz, ist ein altes Script von einem ehemaligen Kollegen, der sich der Problematik in unserem heterogenen Netz angenommen hatte.... Problem derzeit mac9 files -> netatalk -> samba share ;-(


gruss Kai

#!/usr/bin/perl -w
# Einbindung benoetigter Module
use File::Find;
use Cwd;
use Getopt::Long;
# Ersetzungstabelle (Beispiel!)
%Ersetzungstabelle =
(
":2f" => "_",
":80" => "Ae",
":85" => "Oe",
":86" => "Ue",
":87" => "a",
":8a" => "ae",
":8d" => "c",
":9a" => "oe",
":9f" => "ue",
":a7" => "ss",
":aa" => "_",
":c4" => "_",
":c9" => "_",
"\\r" => "",
"," => "",
"\\. " => "_",
"\\.=" => "",
"\"" => ""
);
# Alle Dateien und Unterverzeichnisse, die im aktuellen
# Arbeitsverzeichnis oder ggf. in einem als Kommandozeilenargument
# bergebenen Verzeichnis zu finden sind, werden umbenannt. Achtung:
# Wenn das angegebene Verzeichnis nicht existiert, wird ebenfalls das
# aktuelle Arbeitsverzeichnis bearbeitet!
#
# Beispiel-Programmaufruf:
#
# mac-dateinamen.pl /dir/

# Wird als 1. Kommandozeilenargument '--test' angegeben, wird nur auf
# die Standard-Fehlerausgabe geschrieben, welche Dateien wie umbenannt
# werden wrden. Mit
#
# mac-dateinamen.pl --test verzeichnisname 2> konvert_test.txt
#
# kann diese Ausgabe in eine Datei umgeleitet werden.

GetOptions ("test" => \$test); # nachsehen, ob "--test" gesetzt

$dir = cwd(); # aktuelles Arbeitsverzeichnis

# existiert das ggf. angegebene Verzeichnis?
$dir = ($ARGV[0] && -e $ARGV[0] && -d _ ) ? $ARGV[0] : $dir;

chdir ($dir); # wechseln in zu bearbeitendes Verzeichnis
$dir = cwd(); # neues Arbeitsverzeichnis (absoluter Pfad!)

# Dateien/Verzeichnisse suchen
find (\&wanted, $dir);

# auf jede gefundene Datei wird die Funktion 'wanted()' ausgefhrt,
# die die Ersetzung vornimmt

sub wanted {
$fn = substr ($File::Find::name, length($dir));

print STDERR "Bearbeite $dir$fn:\n" if $test;


# und jedes Element in '%Ersetzungstabelle' ...

while (($alt, $neu) = each %Ersetzungstabelle) {
# ... Ersetzung im aktuellen Datei-/Verzeichnisnamen vornehmen
$fn =~ s/$alt/$Ersetzungstabelle{$alt}/g;
$fn =~ s/ /_/g;
}
print STDERR " $File::Find::name ->\n $dir$fn\n" if $test;


# nur, wenn Kommandozeilenargument "--test" *nicht* angegeben
# worden ist, Ersetzung vornehmen:

rename ($File::Find::name, $dir . $fn) unless $test;
}
#theend

------
 
vielleicht a' weng off topic

aber wenn's mal schnell geh'n soll, dann kann man sowas vom Mac aus einigermassen elegant mit Filebuddy erledigen.

Downloadseite des Entwicklers

Ist für einen bestimmen Zeitraum voll funktionstüchtige Shareware, über deren Anschaffung nachzudenkenken sich lohnt, wenn man mehrere Mac-User im Netzwerk hat. Die können dann auch selber mal was machen...

Mike
 
Zurück
Oben