2012-03-21 57 views
8

我需要建立目錄樹中二進制文件的所有文件擴展名列表。如何列出目錄樹中的所有二進制文件擴展名?

主要問題將需要如何區分一個文本文件和二進制文件,其餘的應該是蛋糕。

編輯:這是我得到的最接近的,有更好的點子嗎?

find . -type f|xargs file|grep -v text|sed -r 's:.*\.(.*)\:.*:\1:g' 
+0

如何UTF-8編碼的文本文件?把它算作一個二進制文件? – PasteBT 2012-03-21 21:46:05

+0

按照慣例,可執行二進制文件沒有擴展名。 – jordanm 2012-03-21 22:04:13

+0

@jordanm除了那顆明星之外,還有一個大膽的顏色。 *鴨* :) – Kaz 2012-03-22 01:23:12

回答

11

這裏有一個竅門,找到二進制文件:

grep -r -m 1 "^" <Your Root> | grep "^Binary file" 

的-m 1使得grep的未讀出所有文件。

+2

清理和比我找到的解決方案更快,這裏是我使用'grep -r -m 1「^」apps | grep「^ Binary file」| sed -r':^ Binary \ sfile \ s(。 *)\ smatches:\ 1:g'' – dukeofgaming 2012-03-22 15:31:53

+0

一個簡單的管道到'awk'{print $ 3}''更簡單... – 2014-10-28 20:53:32

2

Linux上的二進制文件和文本文件沒有區別。 file實用程序查看內容和猜測。不幸的是,這並沒有太大的幫助,因爲file不會產生簡單的「二進制或文本」答案。它有一個複雜的輸出,你需要解析大量的案例。

一種方法是讀取一些固定大小的文件前綴,比如說256字節,然後應用一些啓發式。例如,所有的字節值都是0x0到0x7F,避免了除普通空白之外的控制代碼?這表明ASCII?如果有字節0x80到0xFF,那麼整個緩衝區(除了可能被截斷的末尾的一個代碼除外)是否會解碼爲有效的UTF-8?等

一個想法可能是潛行利用檢測二進制文件,如GNU diff的實用程序。

$ diff -r /bin/ls <(echo foo) 
Binary files /bin/ls and /dev/fd/63 differ 

沒有進程替換,仍然有效:

$ diff -r /bin/ls /dev/null 
Binary files /bin/ls and /dev/null differ 

現在只要用grep的,輸出和查找單詞Binary

問題是diff的啓發式二進制文件是否適用於您的目的。

+2

您可以嘗試使用'file -i',這會導致它將文件格式輸出爲MIME類型。然後,您可以檢查MIME類型是否具有「text /」前綴。我想這可能工作得很好。 – 2012-03-21 21:53:14

+0

很高興知道,謝謝!我正在瀏覽手冊頁,從'file'搜索更加精簡的輸出空間,但沒有發現這一點。 – Kaz 2012-03-21 21:57:37

1

沒有確定的方法來區分「文本」文件和「二進制」文件,這是猜測工作。

#!/bin/bash 
guess=`echo \`head -c 4096 $1 | strings -a -n 1 | wc -c \` '* 1.05 /' \`head -c 4096 $1 | wc -c \` | bc `; 
if [ $guess -eq 1 ] ; then 
    echo $1 "is text file" 
    exit 0 
else 
    echo $1 "is binary file" 
    exit 1 
fi 
4

這佩爾利一個班輪工作對我來說,這也是相當快:

find . -type f -exec perl -MFile::Basename -e 'print (-T $_ ? "" : (fileparse ($_, qr/\.[^.]*/))[2] . "\n") for @ARGV' {} + | sort | uniq 

,這是你可以找到在當前文件夾中的所有二進制文件:

find . -type f -exec perl -e 'print (-B $_ ? "$_\n" : "") for @ARGV' {} + 

-T是對文本文件的測試,-B是二進制文件,它們是相互對立的*。

* perl file tests doc

0

這裏是一個班輪在Python檢查,如果是二進制文件:

b"\x00" in open("/etc/hosts", "rb").read() 

查找殼遞歸地使用它,見下面的例子:

IS_BINARY='import sys; sys.exit(not b"\x00" in open(sys.argv[1], "rb").read())' 
find . -type f -exec bash -c "python -c '$IS_BINARY' {} && echo {}" \; 

要查找所有非二進制文件,請將&&更改爲||

0

下面是簡單的命令列出使用GNU grep所有二進制文件(包括NULL character):

grep -Palr '\x00' . 

要打印的文件擴展名少於5個字,我們可以使用awk,然後使用過濾掉重複要麼是uniq要麼是sort

所以都在一起應該是這樣的:

grep -Palr '\x00' . | awk -F. '{if (length($NF) < 5) print $NF}' | sort -u 
相關問題