Wie erstellt man automatisch Hardlinks?

Post Reply
Message
Author
Mekki

Wie erstellt man automatisch Hardlinks?

#1 Post by Mekki »

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/*

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#2 Post by jochen »

Ne, so wie in Deinem Beispiel geht's nicht. Versuch mal folgendes:

Code: Select all

cd /public
ls  /home/me/mydata | while read FILE ; do
    ln $FILE
done
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
Die grösste Lüge der EDV? "Mal eben..."

Entfernt
Posts: 149
Joined: 22. Jul 1999 12:53

#3 Post by Entfernt »

Irgenwie ist mir diese while read Form in letzter Zeit immer öfter untergekommen. Warum nicht das:

Code: Select all

for i in *; do ln "$i"; done
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.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#4 Post by jochen »

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)
  • 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.
Gerade das Whitespace-Argument wird im Zeitalter bequemer Desktops immer wichtiger.

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Schlachtruf
Posts: 4
Joined: 10. May 2004 8:24

#5 Post by Schlachtruf »

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
Wenn man die Variable in Anführungszeichen setzt ( "$i" ), behebt sich das Problem mit den Leerstellen.

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#6 Post by 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... 8)

Jochen
Die grösste Lüge der EDV? "Mal eben..."

Guest

#7 Post by Guest »

jochen wrote: Zugegebenermassen ist der Buffer in der bash mittlerweile mit 32KB recht gross, aber man weiss ja nie... 8)

Jochen
Was ist noch die Aufgabe des Puffers neben der Aufnahme von Variableninhalten?

MfG

User avatar
jochen
prolinux-forum-admin
Posts: 699
Joined: 14. Jan 2000 15:37
Location: Jülich
Contact:

#8 Post by jochen »

Der Buffer nimmt nicht Variableninhalte auf, sondern die Kommandozeile. Wenn Du zum Beispiel ein

Code: Select all

ls $LS_OPTION /tmp/*
tippst, macht die Shell ein

Code: Select all

ls -al /tmp/datei1 /tmp/datei2 /tmp/datei3 ...
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
Die grösste Lüge der EDV? "Mal eben..."

User avatar
Scory
Posts: 188
Joined: 16. Apr 2004 12:36

#9 Post by Scory »

Warum einfach wenns auch schwer geht ... wie wäre es mit:

ln /home/me/mydata/* /public

Mekki

#10 Post by Mekki »

Vielen Dank:-)
Es hat funktioniert.

Schlachtruf
Posts: 4
Joined: 10. May 2004 8:24

#11 Post by Schlachtruf »

jochen wrote:Der Buffer nimmt nicht Variableninhalte auf, sondern die Kommandozeile. Wenn Du zum Beispiel ein

Code: Select all

ls $LS_OPTION /tmp/*
tippst, macht die Shell ein

Code: Select all

ls -al /tmp/datei1 /tmp/datei2 /tmp/datei3 ...
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
Ja, danke!

Post Reply