gerry56
Goto Top

Attributabfrage einer Datei für Link

Ich möchte in einer Batchdatei mittels Abfrage ermitteln, ob eine vorhandene Datei ein Symlink oder ein Hardlink zu einer Datei ist.

Die Erstellung eines Hardlinks (feste Verknüpfung) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /H d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt
Auch ein Softlink (Symbolik Link) zu einer Datei funktioniert mit dem Befehl D:\hardlink\mklink /s d:\Speicherort-und-Dateiname-Hardlink.txt D:\Original Quelldatei.txt.

Daß immer die Originaldatei aufgerufen wird, habe ich mittels Textdatei überprüft.
Aufruf mittels Link und Text verändert, danach Aufruf vom Quellverzeichnis und den veränderten Text editiert. Danach wieder mittels Link aufgerufen und den veränderten Text gesehen.

Trotzdem habe ich Probleme
Programm Total Commander
Beim Symbolik Link wird eine Dateigröße von 0 angezeigt.
Beim Hardlink wird die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.

Der Windows Explorer
Beim Symlink wird als Dateityp Symlink und bei Dateigröße 0 angezeigt. Zusätzlich wird beim Symbolbild ein Verknüpfungspfeil angezeigt.
Beim Hardlink wird als Dateityp Textdokument und die Dateigröße der Originaldatei angezeigt. Es ist nirgends ersichtlich, daß dies nicht die Originaldatei, sondern ein Hardlink ist.

Der Command Prompt
Mit dem Befehl Dir wird beim Symlink als Dateiart Symlink und in eckiger Klammer der Pfad zur Originaldatei angezeigt.
Beim Hardlink wird wie bei einer normalen Datei die Dateigröße und Dateiname angezeigt.

In meiner Batchdatei ermittle ich die Attribute wie folgt
@echo off
for %%i in (%hardlink%) do set "attr=%%~ai"
echo %hardlink%
echo %attr%

Als Ausgabe erhalte ich für den Symlink --a-----l, (Archivbit und Link)
Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?

Es ist mir aufgefallen, daß ohne Parameterangabe ein Verzeichnislink erstellt wird, und NICHT wie in der Direkthilfe angegeben eine Symbolische Verknüpfung für eine Datei.
Dafür muß der NICHT dokumentierte Parameter /S angegeben werden, um eine symbolische Verknüpfung für eine Datei zu erhalten.

Wo ist mein Denkfehler?
Wie kann ich mittels Batch ermitteln, ob die gewünschte Datei eine verlinkte Datei ist, oder eine einzelne eigene Datei.

Bitte um Hilfe
Danke im voraus
Gerry

Content-ID: 1808101409

Url: https://administrator.de/contentid/1808101409

Ausgedruckt am: 18.11.2024 um 09:11 Uhr

1795827498
1795827498 02.02.2022 aktualisiert um 10:31:30 Uhr
Goto Top
Wo ist mein Denkfehler?
Als Ausgabe erhalte ich für den Hardlink --a------, (Archivbit) ---> Wieso wird hier kein Linkbit gesetzt?
Du hast das Prinzip von NTFS noch nicht verstanden.
Ein Hardlink ist nachdem er erstellt wurde in dem Sinne kein Link mehr weil es ein zusätzlicher Eintrag in der MFT ist der nur eben auf die gleichen Zielbits zeigt wie ein anderer MFT Eintrag.
Wenn du also wissen willst wie viele MFT Einträge es für eine Datei gibt dann

fsutil hardlink list <datename>

https://serverfault.com/questions/758496/get-hardlink-count-for-a-file-o ...

Auf NTFS-Volumes kann jede Datei über mehrere harte Links verfügen, sodass eine einzelne Datei in vielen Verzeichnissen (oder sogar im gleichen Verzeichnis mit unterschiedlichen Namen) angezeigt werden kann. Da alle Links auf dieselbe Datei verweisen, können Programme alle Links öffnen und die Datei ändern. Eine Datei wird erst aus dem Dateisystem gelöscht, nachdem alle Links zu ihr gelöscht wurden. Nachdem Sie einen hard-Link erstellt haben, können Programme ihn wie jeden anderen Dateinamen verwenden.

@echo off
set "file=E:\myfile.txt"  
for /f "tokens=1 delims=:" %%a in ('fsutil hardlink list "%file%" ^| findstr /n .') do set cnt=%%a  
if %cnt% GTR 1 (
	echo File has %cnt% MFT references.
) else (
	echo File is a single.
)
gerry56
gerry56 02.02.2022 aktualisiert um 22:53:35 Uhr
Goto Top
Hallo Unbekannt.

Danke für deinen Beitrag.

Da mein Eingangspost sowieso schon so lang war, wollte ich nicht noch zusätzlich erklären, daß mir bewußt ist, daß unter NTFS die Dateien irgendwo gespeichert sind, und nicht in der Verzeichnisstruktur.
Weiters ist mir auch bekannt, daß eine Datei in verschiedenen Verzeichnissen - sogar mit anderen Namen - aufgerufen werden kann.
Auch wenn ich schon länger keine Batchdateien mehr erstellt habe, ist mir bekannt, daß jede Verzeichniszuordnung einer Datei Inode genannt wird, und daß es auch mehr Inodeeinträge für eine Datei geben kann.

Nun beginnt eventuell mein Denkfehler.
Ich habe eine Datei erstellt, dieser Datei eine Bezeichnung gegeben (z.B. Testeintrag.txt) und diese Dateibezeichnung in einem bestimmten Verzeichnis (z.B. D:\Daten\Muster\) als Eintrag (z.B. D:\Daten\Muster\Testeintrag.txt) abgespeichert.
Nun ist es ja mit dem Befehl mklink möglich, für diese Datei einen weiteren Inodeeintrag per Hardlink zu erstellen.
Dieser Eintrag kann mit dem selben Namen in einem anderen Verzeichnis oder mit einem anderen Namen im selben Verzeichnis erfolgen. Natürlich kann dieser weitere Inodeeintrag auch mit einem anderen Namen in einem anderen Verzeichnis erfolgen.
Da dieser Inodeeintrag mittels mklink als Hardlink erstellt wird, habe ich angenommen, daß so ein Eintrag auch als Hardlink mit dem Attribut l abgefragt werden kann.
Leider mußte ich feststellen, daß dieser Attribut L Eintrag nicht vorhanden ist.

Bei der Abfrage in meiner Batchdatei könnte es ja theoretisch möglich sein, daß die gesuchte Datei mit der richtigen Bezeichnung schon im gesuchten Zielverzeichnis vorhanden ist. Trotzdem könnte diese Datei die falsche Datei sein, da diese Datei nur zufällig die richtige Bezeichnung hat, aber nicht im geforderten Originalverzeichnis vorhanden ist.
Ich möchte auch sicher sein, daß beide Dateien ident (gleich) sind, und sicher die selbe Dateiquelle haben.
Anders gesagt, möchte ich sicher sein, daß nicht ein und die selbe Datei nur von der Quelle zum Ziel kopiert wurden, und daher eine Änderung vom Inhalt in Verzeichnis A nicht in der Datei vom Verzeichnis B vorgenommen wird.
Deshalb möchte ich diese Abfrage machen können.
Ich werde das oben genannte Script auf jeden Fall ausprobieren.
Danke

Gerry