2017-01-11 52 views
1

在我的Linux目錄中,我有6個文件。 5個文件是txt文件,1個文件是.tar.gz類型的文件。我怎樣才能打印到終端只有txt文件的名稱?如何在linux終端上只打印txt文件?

directory :dir 
content: 
ex1, ex2, ex3, ex4, ex5, ex6.tar.gz 
+2

使用[通配符](http://www.linfo.org/wildcard.html) – myaut

+0

'ls * .txt'應該可以做到。 –

+2

@ILikeTau你在哪裏可以看到他的內容中有'.txt'擴展名? – Barmar

回答

0

由於您沒有文件擴展名(.txt),我會嘗試使用排除來完成。

ls | grep -v tar.gz

如果您有多個類型,請使用擴展名。

0

命令'file'後跟一個文件名,將返回文件的類型。

您可以遍歷目錄中的文件,將每個文件名用作「文件」命令的輸入,如果是文本文件,則輸出該文件名。

以下包括從文件命令一些額外的輸出,我不知道怎麼又刪除,但它確實給你你想要的文件名:

​​

你可以把它變成殼腳本放在您想從中獲取文件名的目錄中,然後從命令行運行它。

+0

空白的路徑?另請參見[Unix和Linux協議棧](http://unix.stackexchange.com/)上的[在名稱中使用空格來循環文件?](http://unix.stackexchange.com/q/9496/56041) 。 – jww

+0

'file $ f 2>/dev/null | grep文本' –

+0

最有可能抑制額外的東西 –

0

更新回答

如@ hek2mgl評價所指出的,一個更強大的解決方案是分離使用NULL字符(可能不是在文件名中發生)的文件名,並且將處理包含換行符的文件名,並冒號:

file -0 * | awk -F'\0' '$2 ~ /text/{print $1}' 

原來的答案

我這樣做:

file * | awk -F: '$2~/text/{print $1}' 

運行file看每個文件的類型,並傳遞由冒號分隔的名稱和類型,以awkawk然後在第二個字段中查找單詞text,如果它找到它,則打印第一個字段 - 這是文件名。

嘗試運行它自己以下簡單的命令來看看它是如何工作的:

file * 
+1

如果文件名中有冒號,會發生什麼情況? –

+0

@MadPhysicist好點。這同樣適用於空格。 'file'有一個選項'-print0',可以使用:'file -0 * | awk -F'\ 0''$ 2〜/ text/{print $ 1}'' – hek2mgl

+0

'文件-0'在POSIX版本的文件上不可用。 – dawg

0

使用file命令的意見是正確的。這裏的問題是解析這個命令的輸出,因爲(1)文件名可以包含任何字符,(2)file命令的具體輸出有點不可預知,因爲它取決於所謂的魔術文件是存在的。

如果我們依靠的事實file命令的輸出的說明文字 - 即那部分解釋了什麼文件,它是 - 總是包含單詞文本如果是文本的文件,它永遠不會包含冒號,我們可以如下處理它:

輸出中的最後一個冒號必須將解釋的文件名與文件名分開。左邊的所有內容都是文件名,如果在右邊部分出現text(注意文本!之前的前導空格)這個詞,我們就有一個文本文件。

這仍然給我們留下了那些(希望罕見)情況下,文件名包含非打印字符,它們將被轉換爲自己的八進制等價的,這可能會或可能不是你想看到的是。您可以通過將-r選項傳遞給文件命令來取消該選項。如果你想進一步處理這個文件名,而不是隻顯示給用戶,這很有用,但它可能會破壞你的解析邏輯,特別是如果文件名包含一個換行符。

最後,不要忘記,無論如何,你會看到什麼系統認爲一個文本文件。這不一定是定義爲一個文本文件。

0

指定文件的這個目錄:

$ file * 
1.txt:  UTF-8 Unicode (with BOM) text, with CRLF line terminators 
2.pdf:  PDF document, version 1.5 
3.pdf:  PDF document, version 1.5 
4.dat:  data 
5.txt:  ASCII text 
6.jpg:  JPEG image data, JFIF standard 1.02, aspect ratio, density 100x100, segment length 16, baseline, precision 8, 2833x972, frames 3 
7.html:  HTML document text, UTF-8 Unicode text, with very long lines, with no line terminators 
8.js:  UTF-8 Unicode text 
9.xml:  XML 1.0 document text 
A.pl:  a /opt/local/bin/perl script text executable, ASCII text 
B.Makefile: makefile script text, ASCII text 
C.c:  c program text, ASCII text 
D.docx:  Microsoft Word 2007+ 

你可以看到,是純ASCII的文件只有5.txt,9.xml,和A-C。其餘的是根據file的二進制或UTF。

您可以使用Bash glob遍歷文件並使用file來測試每個文件。這節省不必解析的file爲文件名的輸出,但依賴於file精確識別您認爲什麼是「文」:

for fn in *; do 
    [ -f "$fn" ] || continue 
    fo=$(file "$fn") 
    [[ $fo =~ ^"$fn":.*text ]] || continue 
    echo "$fn" 
done  

如果您不能使用file,這當然是最簡單的方法,你可以打開文件並查找二進制字符。使用Perl爲:

for fn in *; do 
    [ -f "$fn" ] || continue 
    head -c 2000 "$fn" | perl -lne '$tot+=length; $cnt+=s/[^[:ascii:]]//g; END{exit 1 if($cnt/$tot>0.03);}' 
    [ $? -eq 0 ] || continue 
    echo "$fn" 
done  

在這種情況下,我找了ASCII與非ASCII的前2000個字節的文件的百分比。 YMMV,但允許查找file將報告爲UTF的文件(因爲它具有二進制BOM),但大多數文件是ascii。

對於該目錄中,這兩個Bash腳本報告(與我的每個文件的註釋):

1.txt  # UTF file with a binary BOM but no UTF characters -- all ascii 
4.dat  # text based configuration file for a router. file does not report this 
5.txt  # Pure ascii file 
7.html # html file 
8.js  # Javascript sourcecode 
9.xml  # xml file all text 
A.pl  # Perl file 
B.Makefile # Unix make file 
C.c  # C source file 

由於file不考慮所有的ASCII文件4.dat是文本,它不被首次報道Bash腳本,但在第二個。否則 - 相同的輸出。