2017-01-11 2 views
1

В моем каталоге Linux у меня есть 6 файлов. 5 файлов - это файлы txt и 1 файл .tar.gz. Как я могу напечатать на терминале только имя файлов txt?Как печатать только файлы txt на терминале linux?

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', за которой следует имя файла, вернет тип файла.

Вы можете перебрать файлы в своем каталоге, использовать каждое имя файла в качестве входных данных в команду «файл», а если это текстовый файл, распечатайте это имя файла.

Следующая включает в себя некоторые дополнительные вывод команды файла, который я не знаю, как удалить, но она дает вам имена файлов, которые вы хотите:

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

Вы можете поместить это в оболочку сценарий в каталоге, из которого вы хотите получить имена файлов, и запустить его из командной строки.

+0

Пробел в пути? Также см. [Цитирование через файлы с пробелами в именах?] (Http://unix.stackexchange.com/q/9496/56041) в [Unix & Linux Stack Exchange] (http://unix.stackexchange.com/) , – jww

+0

'файл $ f 2>/dev/null | grep text' –

+0

Чтобы подавить дополнительный материал, скорее всего, –

0

Обновлено Ответ

Как @ hek2mgl указует в комментариях, более надежное решение для разделения имен файлов с использованием последовательности нулевых символов (которые не может произойти в именах файлов), и что будет иметь дело с именами файлов, содержащими переводы строк, и колоны:

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

оригинальный ответ

Я хотел бы сделать это:

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

Это работает file увидеть тип каждого файла и передает имена и типы в awk, разделенных двоеточием. awk затем ищет слово 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. Остальные либо двоичные, либо UTF в соответствии с file.

Вы можете использовать шарик Bash для прокрутки файлов и использовать 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 (так как он имеет двоичную спецификацию), но большая часть файла - 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, но второй. В противном случае - тот же вывод.

Смежные вопросы