2013-01-24 13 views
5

Ich möchte auf meinem Linux-Rechner menschenlesbare Dateien ohne Einschränkung der Dateierweiterung finden. Diese Dateien sollten aus menschlichen Erkennungsdateien wie Text-, Konfigurations-, HTML-, Quellcode-Dateien bestehen. Können Sie einen Weg zum Filtern und Lokalisieren vorschlagen?Suche nach menschenlesbaren Dateien unter Unix

+1

Das Dienstprogramm 'file' ist ziemlich gut darin, den Inhaltstyp einer Datei zu bestimmen. Vielleicht könnten Sie dies verwenden und Dateien basierend auf ihrer Ausgabe filtern. – cdhowie

+0

AFAIK nur Windows vertraut Dateierweiterung. UNIX-ähnliche Betriebssysteme verwenden 'file'. Wie auch immer, Sie müssen "menschenlesbar" definieren. – m0skit0

+0

Wie genau muss das sein? Und suchen Sie nach JEDER Datei im System oder nur in einem ausgewählten Teil des Systems? Was ist, wenn das System über mehrere Terabyte an Festplatten verfügt? Ist es akzeptabel, mehrere Stunden zu warten (weil so viele Dateien tatsächlich gelesen werden müssen)? –

Antwort

6

finden und Datei sind deine Freunde hier:

find /dir/to/search -type f -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print 

diese alle Dateien finden (Hinweis: es wird nicht Symlinks Verzeichnisse Steckdosen usw. nur reguläre Dateien finden) in/dir/to/Such- und Lauf sh - c 'Datei -b {} | grep text &>/dev/null '\; der den Dateityp betrachtet und nach Text in der Beschreibung sucht. Wenn dies wahr zurückgibt (dh Text ist in der Zeile), wird der Dateiname ausgegeben.

HINWEIS: Wenn Sie das Flag -b für die Datei verwenden, bedeutet dies, dass der Dateiname nicht gedruckt wird und daher keine Probleme mit dem Grep verursachen kann. zB ohne das Flag -b würde die Binärdatei gettext fälschlicherweise als Textdatei erkannt werden.

zB

[email protected]# find /bin -exec sh -c 'file -b {} | grep text &>/dev/null' \; -print 
/bin/gunzip 
/bin/svnshell.sh 
/bin/unicode_stop 
/bin/unicode_start 
/bin/zcat 
/bin/redhat_lsb_init 
[email protected]# find /bin -type f -name *text* 
/bin/gettext 

EDIT:

Wenn Sie in komprimierten Dateien die --uncompress Flag-Datei verwenden zu suchen. für weitere Informationen und Fahnen Datei

+0

Ich bin neu im Unix-ähnlichen Ökosystem. Warum benutzt du "&" am Ende deiner 'grep'? Nach meinem Verständnis wird grep asynchron laufen. Wird dies immer noch den Exit-Status zu "finden" geben? Warum sollte man das tun? Danke, dass Sie sich die Zeit genommen haben, zu antworten. –

10

Wie wäre es

find /dir/to/search -type f | xargs file | grep text

find Sie eine Liste von Dateien geben man file sehen.

xargs file wird der Befehl file auf jeder der Leitungen vom piped Eingang ausgeführt.

+0

Funktioniert perfekt!Nette Lösung. – fuuman

-1

i verwenden

file directory/to/search/* 

Zum Beispiel nur für Menschen lesbare Dateien in einem Verzeichnis mit dem Namen Heimgebrauch zu finden:

file home/* 

und lesbarer Datei wird ein Format wie ASCII-Text

+0

Dies bietet keine Methode zum Filtern der Datei, außer zum manuellen Suchen nach Dateitypen. – blissfool