Zum Inhalt springen

Linux/Datei/Link: Unterschied zwischen den Versionen

Aus Foxwiki
Markierung: Geleert
Zeile 1: Zeile 1:
== symbolic link ==


=== find all files that link to this file ===
==== It depends ====
if you are trying to find links to a specific file that is called <tt>foo.txt,</tt> then this is the only good way:
find -L / -samefile path/to/foo.txt
On the other hand, if you are just trying to find links to ''any'' file that happens to be named <tt>foo.txt</tt>, then something like
find / -lname foo.txt
or
find . -lname \*foo.txt
ignore leading pathname components
* problem solved beautifully. Thanks to all people that replied.
* As I commented on a deleted answer, you can use <tt>-xtype l</tt> to have find only list symlinks
* you may want to recurse, as any of the files pointing to foo.txt may themselves be pointed-at by some other links... ex: A->B->foo.txt, /tmp/C->B->foo.txt, etc.
* this can work too if your name component is a parent directory named in the link, by searching <tt>find . -lname '*foo.dir*'</tt> (matches e.g. <tt>file.txt -> ../foo.dir/file.txt</tt>)
* This answer is really helpful, thanks so much. By the way, if we want to get more info about the results of "find", we can pass the output of "find" to "ls": <tt>find -L /usr -samefile /usr/share/pyshared/lsb_release.py 2>/dev/null | xargs ls -al</tt>
Find the inode number of the file and then search for all files with the same inode number
$ ls -i foo.txt
41525360 foo.txt
$ find . -follow -inum 41525360
Alternatively, try the <tt>lname</tt> option of <tt>find</tt>, but this won't work if you have relative symlinks e.g. <tt>a -> ../foo.txt</tt>
$ find . -lname /path/to/foo.txt*
If using a recent version of GNU find, you can also use the <tt>-samefile</tt> option with <tt>-L</tt> for the same effect, without having to look up the inode yourself
* But this will also find files on other file systems that happen to have the same inode number.
* If <tt>foo</tt> is a directory, use <tt>ln -di</tt>, in one line: <tt>find . -follow -inum $(ls -di foo.txt |cut -d" " -f1)</tt>
This answer is wrong
* A symlink doesn't have the same inode as its target. This will only work for a file inside a symlinked folder. But this is not what was asked.
==== symlinks utility ====
; I prefer to use the <tt>symlinks</tt> utility, which also is handy when searching for broken symlinks.
Install by:
sudo apt install symlinks
Show all symlinks in current folder and subfolders:
symlinks -rv .* <tt>-r</tt>: recursive
* <tt>-v</tt>: verbose (show all symlinks, not only broken ones)
To find a specific symlink, just <tt>grep</tt>
symlinks -rv . | grep foo.txt*
Never heard of symlinks before (repo). 'A useful utility for maintainers of FTP sites, CDROMs, and Linux software distributions. It scans directories for symbolic links and lists them on stdout, often revealing flaws in the filesystem tree.' Great little ancient tool by ancient kernel hacker Mark Lord, the 'original developer and maintainer of the IDE Performance Package for linux, the Linux IDE Driver subsystem, hdparm', now maintained by J. Brandt Buckley.
Works great and is fast. Note, however, that you'll need to do a search in each discrete partition of interest (as <tt>symlinks</tt> does not reliably (AFAIK) search across what is calls "different filesystems"). Also, <tt>symlinks -rv . 2>/dev/null | grep foo.txt</tt> may result in "cleaner" output...
[[Kategorie:Linux/Datei/Link]]

Version vom 3. Januar 2025, 12:53 Uhr