Wie erstellt man automatisch Hardlinks?
Wie erstellt man automatisch Hardlinks?
Ich möchte automatisch Hardlinks anlegen.
Zum Beispiel von allen Dateien im Ordner mydata einen Hardlink nach public.
ls -1 /home/me/mydata | ln /public/*
Zum Beispiel von allen Dateien im Ordner mydata einen Hardlink nach public.
ls -1 /home/me/mydata | ln /public/*
Ne, so wie in Deinem Beispiel geht's nicht. Versuch mal folgendes: Wenn ln mit nur einem Argument aufgerufen wird, erstellt es im aktuellen Verzeichnis einen Link gleichen Namens (basename $FILE), der auf das Origonal-File zeigt. Allerdings ist die Unterscheidung in Original und Link bei Hardlinks müssig. Auch die Option "-1" zu ls ist unnötig, weil die automataisch gesetzt wird, wenn der Output von ls nicht an ein Terminal geht.
Jochen
Code: Select all
cd /public
ls /home/me/mydata | while read FILE ; do
ln $FILE
done
Jochen
Die grösste Lüge der EDV? "Mal eben..."
Irgenwie ist mir diese while read Form in letzter Zeit immer öfter untergekommen. Warum nicht das:
Im Übrigen gibt es bei Hardlinks kein Original und kein nicht-Original. Die sind identlisch, es ist auch egal, welches man löscht. Es sind halt zwei Namen für dieselbe Datei.
Code: Select all
for i in *; do ln "$i"; done
Gründe gegen "for FILE in *":
Jochen
- Whitespace in Dateinamen trennen (je nach Shell) die Verarbeitung einer Datei in mehrere Schleifendurchläufe mit jeweils einem Teil des Dateinamens auf, was natürlich nicht funktioniert (zugegebermassen müsste man dann bei der "while read-Methode noch mit IFS basteln, aber einzelne Blanks im Dateinamen funktionieren auch so)
- Wenn einige tausend Dateien im Verzeichnis liegen, platzt der Shell die Argument List für die for-schleife. Kann bei der "while read"-Methode nicht passieren, da Name für Name durch die Pipe läuft.
Jochen
Die grösste Lüge der EDV? "Mal eben..."
-
- Posts: 4
- Joined: 10. May 2004 8:24
Wenn man die Variable in Anführungszeichen setzt ( "$i" ), behebt sich das Problem mit den Leerstellen.jochen wrote:Gründe gegen "for FILE in *":
- Whitespace in Dateinamen trennen (je nach Shell) die Verarbeitung einer Datei in mehrere Schleifendurchläufe mit jeweils einem Teil des Dateinamens auf, was natürlich nicht funktioniert (zugegebermassen müsste man dann bei der "while read-Methode noch mit IFS basteln, aber einzelne Blanks im Dateinamen funktionieren auch so)
Jochen
So, nach ein paar Tests muss ich mich teilweise korrigieren.
Das Whitespace-Problem existiert so nicht mehr - zumindest, wenn man auf einigermassen aktuellen UNIX-Varianten arbeitet. bash und ash machen es richtig, die sh von Solaris 8 auch. Aber ich könnte schwören, dass ich Shellskripte wegen genau dieses Problems umgestellt habe... Das ist allerdings auch schon ein paar Jahre her. Noch dazu liefen die grösstenteils unter SCO UNIX (OpenDesktop, OpenServer), von dem ich auch schon damals nicht die beste Meinung hatte. Mag sein, dass ich da einen Bug/ein Misfeature von SCO UNIX verallgemeinert habe.
Ich nehme also alles zurück und behaupte das Gegenteil!
Allerdings ist mein anderes Argument, dass durch das Sternchen bei grossen Directories die Kommandozeile platzen kann, immer noch gültig! Zugegebenermassen ist der Buffer in der bash mittlerweile mit 32KB recht gross, aber man weiss ja nie...
Jochen
Das Whitespace-Problem existiert so nicht mehr - zumindest, wenn man auf einigermassen aktuellen UNIX-Varianten arbeitet. bash und ash machen es richtig, die sh von Solaris 8 auch. Aber ich könnte schwören, dass ich Shellskripte wegen genau dieses Problems umgestellt habe... Das ist allerdings auch schon ein paar Jahre her. Noch dazu liefen die grösstenteils unter SCO UNIX (OpenDesktop, OpenServer), von dem ich auch schon damals nicht die beste Meinung hatte. Mag sein, dass ich da einen Bug/ein Misfeature von SCO UNIX verallgemeinert habe.
Ich nehme also alles zurück und behaupte das Gegenteil!
Allerdings ist mein anderes Argument, dass durch das Sternchen bei grossen Directories die Kommandozeile platzen kann, immer noch gültig! Zugegebenermassen ist der Buffer in der bash mittlerweile mit 32KB recht gross, aber man weiss ja nie...
Jochen
Die grösste Lüge der EDV? "Mal eben..."
Der Buffer nimmt nicht Variableninhalte auf, sondern die Kommandozeile. Wenn Du zum Beispiel ein tippst, macht die Shell ein daraus (wenn in der Shellvariablen LS_OPTION ein "-al" drin steht). Und dazu wird intern ein Buffer verwendet, der 32KB gross ist. Beantwortet das Deine Frage?
Jochen
Code: Select all
ls $LS_OPTION /tmp/*
Code: Select all
ls -al /tmp/datei1 /tmp/datei2 /tmp/datei3 ...
Jochen
Die grösste Lüge der EDV? "Mal eben..."
-
- Posts: 4
- Joined: 10. May 2004 8:24
Ja, danke!jochen wrote:Der Buffer nimmt nicht Variableninhalte auf, sondern die Kommandozeile. Wenn Du zum Beispiel eintippst, macht die Shell einCode: Select all
ls $LS_OPTION /tmp/*
daraus (wenn in der Shellvariablen LS_OPTION ein "-al" drin steht). Und dazu wird intern ein Buffer verwendet, der 32KB gross ist. Beantwortet das Deine Frage?Code: Select all
ls -al /tmp/datei1 /tmp/datei2 /tmp/datei3 ...
Jochen