簡體   English   中英

如何在linux終端上只打印txt文件?

[英]How to print only txt files on linux terminal?

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

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

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

您可以遍歷目錄中的文件,使用每個文件名作為'file'命令的輸入,如果是文本文件,則打印該文件名。

以下包括來自file命令的一些額外輸出,我不知道如何刪除,但它確實為您提供了所需的文件名:

#!/bin/bash
for f in *
do
  file $f | grep text
done

您可以將其放入要從中獲取文件名的目錄中的shell腳本,然后從命令行運行它。

因為你沒有文件擴展名(.txt),我會嘗試排除。

ls | grep -v tar.gz

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

更新的答案

正如@ hek2mgl在評論中指出的,一個更強大的解決方案是使用nul字符(可能不會出現在文件名中)來分隔文件名,這將處理包含換行符和冒號的文件名:

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

原始答案

我會這樣做:

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

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

嘗試單獨運行以下更簡單的命令,看看它是如何工作的:

file *

使用file命令的建議是正確的。 這里的問題是解析這個命令的輸出,因為(1)文件名可以包含任何字符,(2) file命令的具體輸出有點不可預測,因為它取決於所謂的魔術文件是如何當下。

如果我們依賴於file命令輸出的說明文本 - 即解釋它是什么文件的部分 - 如果它是文本文件總是包含單詞text ,並且它從不包含冒號,我們可以處理如下:

輸出中的最后一個冒號必須將文件名與說明分開。 一切左側是文件名,如果字text (注意文本之前前導空格!)在右邊出現,我們有一個文本文件。

這仍然讓我們看到那些(希望很少見)文件名包含不可打印字符的情況,它們將被翻譯成它們的八進制等價物,這可能是也可能不是你想要看到的。 您可以通過將-r選項傳遞給file命令來抑制此操作 如果您希望進一步處理此文件名而不是僅將其顯示給用戶,這很有用,但它可能會破壞您的解析邏輯,尤其是在文件名包含換行符的情況下。

最后,不要忘記在任何情況下,您都會看到系統認為文本文件的內容。 這不一定與定義為文本文件的內容相同。

鑒於此文件目錄:

$ 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和AC。 其余的是根據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    

在這種情況下,我在文件的前2000個字節中尋找ascii與非ascii的百分比。 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腳本不報告它,而是由第二個報告。 否則 - 相同的輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM