Hakuch
Anmeldungsdatum: 11. Januar 2016
Beiträge: 3
|
statt zu fragen biete ich diesmal was an. Ich find Hardlinks eigentlich megapraktisch nur stört die Einschränkung, die nicht auf Ordner anwenden zu können extrem. Darum hab ich mir ein kleines Script geschrieben, dass die Dateien hardlinkt und die Ordner und Unterordner neu anlegt. In Verbindung mit dem Doublecmd und external Commands kann ich damit nun supereinfach Archive wie Musiksammlungen organisieren ohne von einem Programm abhängig zu sein. Also die Musikdateien gibt es physisch nur einmal, aber ich kann die Interpreten-Ordner in verschiedenen Ordnern (Kategorien) verschieben. Is nur einfach und schnell geschrieben, aber das wichtigste geht (ok nur einzelne Ordner bisher, nervt ein bisschen) 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 | #!/bin/bash
function linkdir {
i=0
argv=()
for arg in "$@"; do
argv[$i]="$arg"
i=$((i + 1))
done
source=${argv[0]}
target=${argv[1]}
foldername=$(basename "$source")
target="$target/$foldername"
echo "creating folder: ${target}"
mkdir "$target"
for file in "$source"/*; do
if [ -d "$file" ]; then
linkdir "$file" "$target"
else
filename=$(basename "$file")
echo "creating hardlink for: ${filename}"
ln -i "$file" "$target"
fi
done
}
linkdir "$@"
|
oder gar hier falls ich doch mal was ändere: https://github.com/Haikuch/dln
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Ich weiß nicht, ob ich Dein Anliegen richtig verstehe, aber macht cp -al QUELLE ZIEL nicht genau das? Die Option -l legt im ZIEL Hardlinks aller „kopierten“ Dateien an. -a sorgt neben der Erhaltung der Dateiattribute und -zeiten für eine rekursive Berücksichtigung aller Unterverzeichnisse. Sind die Dateiattribute egal, kann man nur für's Rekursive statt -a auch -R nehmen, also cp -Rl QUELLE ZIEL
|
Hakuch
(Themenstarter)
Anmeldungsdatum: 11. Januar 2016
Beiträge: 3
|
ach na toll, warum bin ich da nicht mal früher drauf gestoßen ☺ Ne den kannte ich echt noch nicht und war mir beim wohl nicht ausreichend suchen auch nicht begegnet, ich schreib das mal ins Wiki zum ln Hatte mich auch schon ziemlich gewundet, dass das niemand vermisst. Manchmal lohnt es sich wohl auch altbekannte Befehle nochmal anzuschauen
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Naja, auch überflüssige Skript schulen im Skripten. ☺ Ich habe diese Option von cp auch erst entdeckt, nachdem ich feststellen musste, dass die Option --link-dest von rsync genau das leider nicht macht. 😐
|
Hakuch
(Themenstarter)
Anmeldungsdatum: 11. Januar 2016
Beiträge: 3
|
Na und vielleicht stößt jemand anders auf den Thread dem dann geholfen ist. Und da hier gleich noch der Tipp wie man das im Doublecmd einsetzen kann: Oben bei den kleinen Buttons rechtsklick machen, dann auf edit. Dann auf "Insert new Button" und links "External Command" auswählen. Dann eingeben: Icon: such dir was aus
Tooltip: irgendeinen sinnvollen Text eingeben (z.B. Hardlink erzeugen)
Command: cp
Parameters: -la %p %Dt
Start path: egal
HotKey: Hier am besten noch nen Hotkey aussuchen, ich hab shift+F5 genommen. Also quasi ein erweitertes kopieren. Wär interessant, ob man sich in anderen Dateimanagern vielleicht analog zu strg+c oder strg+x was basteln kann, dass dann dieses command benutzt?!
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
V_for_Vortex schrieb: Naja, auch überflüssige Skript schulen im Skripten. ☺ Ich habe diese Option von cp auch erst entdeckt, nachdem ich feststellen musste, dass die Option --link-dest von rsync genau das leider nicht macht. 😐
Doch, richtig angewandt schon: rsync#Differentielle-Sicherung-des-Systems. Hatte mich aber vor dem Erstellen des Abschnittes auch einige Versuche gekostet, da es auch ähnliche Optionen gibt.
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Benno-007 schrieb: Doch, richtig angewandt schon: rsync#Differentielle-Sicherung-des-Systems.
Das Beispiel beschreibt nicht den hiesigen Fall, es geht von einer QUELLE, einem ZIEL und einem älteren Vergleichs-ZIEL (V-ZIEL) aus. Im hiesigen Fall gibt es aber kein V-ZIEL, es soll einfach eine Hardlink-Kopie von QUELLE in ZIEL erstellt werden. Wenn man --link-dest zu diesem Zweck auf QUELLE zeigen lässt, passiert das: $ rsync -avx --link-dest=/pfad/zur/QUELLE QUELLE/ ZIEL
sending incremental file list
./
sent 237 bytes received 20 bytes 514.00 bytes/sec
total size is 2,601,353,216 speedup is 10,121,996.95 Oder wo liegt mein Denkfehler?
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Stimmt. Den cp kannte bzw. benutzte ich so aber auch noch nicht. Gut zu wissen. Bei rsync müsste man erst erst jede Datei im Vergleichsordner als Kopie haben und im Quellordner touchen...
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Schade, ich hatte auf einen Denkfehler meinerseits gehofft. ☺ Von der Arbeitsweise link-dests her hätte ich erwartet, dass ein link-dest auf die Quelle eben dazu führt, dass Hardlinks im Ziel angelegt werden, weil ja dann die Dateien von der Quelle und link-dest identisch sind. Warum rsync dann gar nichts kopiert oder verlinkt, ist mir schleierhaft. Aber gut, ein Fehlversuch lehrt ja auch etwas. 🤓
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Themenverwandt: hardlink (Projektseite) scannt Verzeichnisse rekursiv und verlinkt identische Dateien nachträglich. 💡 (Bevor Hakuch auf die Idee kommt, dafür auch ein Skript zu schreiben. 😀 *duck*)
|
Benno-007
Anmeldungsdatum: 28. August 2007
Beiträge: 29240
Wohnort: Germany
|
Eben drum - rsync sichert alles AUßER identische Dateien. Darum touchen und läuft... Ach Quatsch - stimmt: Es müssen Links angelegt werden, sofern Ziel Linuxdateisystem. Die passenden Optionen aus meinem Wikibeispiel übernehmen, z.B. -H.
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
V_for_Vortex schrieb: Wenn man --link-dest zu diesem Zweck auf QUELLE zeigen lässt, passiert das: $ rsync -avx --link-dest=/pfad/zur/QUELLE QUELLE/ ZIEL
sending incremental file list
./
sent 237 bytes received 20 bytes 514.00 bytes/sec
total size is 2,601,353,216 speedup is 10,121,996.95
Argh, rsync zeigt trotz -v das Verlinken nicht an. Der obige Befehl hat wie erwartet Hardlinks von QUELLE in ZIEL angelegt. Es wird nur nicht angezeigt, selbst mit --stats nicht! 🙄 🐸 $ rsync -avx --stats --link-dest=/pfad/zur/QUELLE QUELLE/ ZIEL
sending incremental file list
./
Number of files: 5 (reg: 3, dir: 2)
Number of created files: 0
Number of deleted files: 0
Number of regular files transferred: 0
Total file size: 2,601,353,216 bytes
Total transferred file size: 0 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 237
Total bytes received: 20
sent 237 bytes received 20 bytes 514.00 bytes/sec
total size is 2,601,353,216 speedup is 10,121,996.95 Somit ist --link-dest auf die Quelle zeigend eine Alternative zu cp -al und cp -Rl , falls man dabei weitere Features von rsync nutzen will. Aber Achtung: Es muss ein „/“ am Ende von QUELLE/ stehen, da bei rsync sonst eine Verzeichnisebene zu hoch ansetzt. Link-dest benötigt den absoluten /pfad/zur/QUELLE, weder QUELLE alleine noch ./QUELLE funktionieren: --link-dest arg does not exist: ./QUELLE
|
V_for_Vortex
Anmeldungsdatum: 1. Februar 2007
Beiträge: 12085
Wohnort: Berlin
|
Hakuch schrieb: ich schreib das mal ins Wiki zum ln
Super, nur hast Du dabei die Option -a vergessen, ohne die cp nicht in Verzeichnisse hinabsteigt. Hab sie mal ergänzt. Außerdem habe ich die rsync-Variante in den rsync-Artikel geschrieben.
|