• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Dateien und Verzeichnisse auflisten, die mehr als einen Name

MisterX

Newbie
Guten Morgen zusammen,

ich würde gerne eine Liste haben , welche alle Dateien und Verzeichnisse anzeigt, die im Dateisystem mehr als einen Namen besitzen ( also diejenigen , auf die mindestens ein Hardlink existiert). Wenn dies irgendwie möglich ist, soll das mit grep und entsprechenden Filterprogrammen realisiert werden. Leider fehlt mir da ein Ansatz...
wäre nett wenn Ihr mir weiterhelfen könntet.


Vielen Dank und Grüße
MisterX
 

RME

Advanced Hacker
Hallo,

Mit "find" kannst Du solche Dateien finden.

> man find

Insbesondere die Optionen:

-links n
-lname pattern
-type c (c=l für symbolic link)
etc.

Griuss,
Roland
 
A

Anonymous

Gast
mal in die Manpage von find schauen http://linux.die.net/man/1/find , dort gibt es einen Option "-links" damit kannst du Dateien nach der Anzahl der Hardlinks suchen, jetzt nur noch die Verzeichnisse ausschließen, die haben alle immer Sysmlinks, das geht mit der Option "-type f" und schon hast du alles was du brauchst
macht zusammen zB
Code:
find / -type f -links +1

robi
PS:
war schon wieder einer schneller
 
OP
M

MisterX

Newbie
Danke schön für die vielen und schnellen Antworten :)

Es funktioniert auf jeden fall so, nur soll dies mit grep gemacht werden. Gibt es da keine möglichkeit?
 

RME

Advanced Hacker
Es wäre nützlich wenn Du etwas genauer erklären würdest was Du machen möchtest. Du kannst ja "grep <was auch immer>" mit "find" kombinieren.

Etwa so:

> find <wie oben beschrieben> -print0 -exec grep <was auch immer> {} ";"

Roland
 
OP
M

MisterX

Newbie
Hallo Roland,
Ich möchte alle Dateien anzeigen lassen, welche im Dateisystem mehr als einen Namen haben. In der Aufgabe soll man hierzu find und grep kombinieren.
Entschuldigung bin relativ neu auf diesem Gebiet..

Grüße
MisterX
 
A

Anonymous

Gast
MisterX schrieb:
nur soll dies mit grep gemacht werden
;) hört sich so nach Hausaufgabe an.

mit ls Verzeichnisbaum rekursiv auflisten, einen schönen Regulären Ausdruck schreiben der dann in grep die Arbeit macht.
Es geht auch noch umständlicher, erst "ls" dann "cut" dann eventuell noch ein "grep -v" dann nochmal "grep"
Übrigens Verzeichniss habe alle mindestens 2 Namen. Einer davon ist immer "."


robi
 

RME

Advanced Hacker
Also, es ist eine Hausaufgabe... hier ein paar Ideen: :D

Du findest Dateien mit Hardlinks so (z.B. im Verzeichnis /usr/bin):
Code:
# find /usr/bin -links +1 -print
Um zu sehen wieviele Links irgend eine der gelisteten Dateien hat (z.B. /usr/bin/hcd):
Code:
# ls -l /usr/bin/hcd
-rwxr-xr-x 14 root root 120652 2010-07-05 15:14 /usr/bin/hcd
--> 14 Links

oder (/usr/bin/perlbug):
Code:
# ls -l /usr/bin/perlbug
-rwxr-xr-x 2 root root 45687 2010-07-30 02:18 /usr/bin/perlbug
--> 2 Links (sich selber und eine andere)

Um alle gelinkten Dateien aufzulisten (z.B. für /usr/bin/perlbug):
Code:
# find /usr/bin -xdev -samefile /usr/bin/perlbug
/usr/bin/perlbug
/usr/bin/perlthanks
Du könntest jetzt versuchen dies so anzuwenden dass alle gelinkten Dateien auf's mal gelistet werden.

Irgendwie mit "find" plus "xargs"

> find <...> | xargs <...>

oder, eine Verzeichnis-Datei erstellen und diese dann durchsuchen nach Dateien mit gleicher inode Nummer.

oder, ...

===== andere Methode =====

Wie oben gezeigt, kannst Du mit "ls" sehen ob (und wenn wie öfter) eine Datei gelinkt ist:

z.B.
Code:
# ls -l /usr/bin/perl*
-rwxr-xr-x 2 root root 2895864 2010-07-30 02:20 /usr/bin/perl
-rwxr-xr-x 2 root root 2895864 2010-07-30 02:20 /usr/bin/perl5.12.1
-rwxr-xr-x 2 root root   45687 2010-07-30 02:18 /usr/bin/perlbug
-rwxr-xr-x 1 root root     224 2010-07-30 02:18 /usr/bin/perldoc
-rwxr-xr-x 1 root root   12454 2010-07-30 02:18 /usr/bin/perlivp
-rwxr-xr-x 2 root root   45687 2010-07-30 02:18 /usr/bin/perlthanks

(4 der Dateien sind gelinkt, 2 nicht)

Um nun alle gelinkten Dateien in "/usr/bin" aufzulisten:
Code:
# ls -la /usr/bin/ | grep "^[^\ ]*\ *[^ 1 ]\ [a-z]"
drwxr-xr-x  2 root root       69632 2010-11-18 19:30 .
-rwxr-xr-x  2 root root       31181 2010-07-01 18:36 aclocal
-rwxr-xr-x  2 root root       31181 2010-07-01 18:36 aclocal-1.11
-rwxr-xr-x  2 root root      257154 2010-07-01 18:36 automake
-rwxr-xr-x  2 root root      257154 2010-07-01 18:36 automake-1.11
-rwxr-xr-x  2 root root       36601 2010-07-30 02:18 c2ph
-rwxr-xr-x  2 root root        9896 2010-07-05 13:58 man
-rwxr-xr-x  2 root root        9896 2010-07-05 13:58 mandb
-rwxr-xr-x  3 root root       18016 2010-07-05 13:44 nm86
-rwxr-xr-x  3 root root       18016 2010-07-05 13:44 objdump86
-rwxr-xr-x  2 root root     2895864 2010-07-30 02:20 perl
-rwxr-xr-x  2 root root     2895864 2010-07-30 02:20 perl5.12.1
-rwxr-xr-x  2 root root       45687 2010-07-30 02:18 perlbug
-rwxr-xr-x  2 root root       45687 2010-07-30 02:18 perlthanks
-rwxr-xr-x  2 root root       53325 2010-07-30 02:18 psed
-rwxr-xr-x  2 root root       36601 2010-07-30 02:18 pstruct
-rwxr-xr-x  2 root root       53325 2010-07-30 02:18 s2p
-rwxr-xr-x  3 root root       18016 2010-07-05 13:44 size86
-r-xr-xr-x  2 root root       26368 2010-07-05 13:12 skill
-r-xr-xr-x  2 root root       26368 2010-07-05 13:12 snice
-rwxr-xr-x  3 root root       22372 2010-07-05 13:47 ypchfn
-rwxr-xr-x  3 root root       22372 2010-07-05 13:47 ypchsh
-rwxr-xr-x  3 root root       22372 2010-07-05 13:47 yppasswd
#

Achtung: die Pattern stimmt möglicherweise noch nicht ganz!

Die grep Pattern "^-[^\ ]*\ *[^ 1 ]\ [a-z]" bedeutet:

Am Anfang der gesuchten Zeichen Folge ist ein "-" ("^-)
gefolgt von beliebig vielen Nicht-Leerzeichen ([^\ ]*)
gefolgt von beliebig vielen Leerzeichen (\ *)
_nicht_ gefolgt von " 1 " (Leerzeichen 1 Leerzeichen)
gefolgt von einem Leerzeichen (\ )
gefolgt von einem Klein-Buchstaben ([a-z])

Generell würdest Du "ls -lR" gebrauchen (rekursiv); und "ls -lR /" um im Root Verzeichniss zu beginnen.

Gruss,
Roland
 
Oben