2016-09-01 3 views
1

У меня есть несколько файлов в моем рабочем каталоге, и я хочу напечатать все текстовые файлы, проблема в моем WD также является каталогом. Это означает, что, когда я типа:Bash: Различать файлы и каталоги с помощью подстановочных знаков

cat * 

Выход:

9 Tom Grapes 28 
10 Ben Lemon 21 
11 Paul Lime 37 

Next cool file 

cat: yang: Is a directory 
cat: ying: Is a directory 

Я хочу, чтобы удалить эти 'ошибки-сообщения', так что я пробовал:

cat *[!/] 

Но это просто возвращается:

cat: '*[!/]': No such file or directory 

Но, наоборот, ound:

cat */ 

печатает только:

cat: yang: Is a directory 
cat: ying: Is a directory 

Означает ли это все, даже файлы заканчиваются косой чертой? Если да, есть ли способ различать файлы и каталоги? Если нет, то почему эта дикая карта не работает?

PS: Я использую Linux

+3

Примечание сторону: Вы используете Баш, но если вы свободны в выборе оболочки , вы можете использовать Zsh.Несколько проблем, которые трудно решить в bash, легки (хотя иногда выглядят немного загадочными) в Zsh. В вашем случае команда Zsh будет 'cat * (^ /)'. Выражение в скобках говорит «нет каталогов». Как и bash, это даст ошибку, если нет простых файлов. Если вы хотите, чтобы этот кот в этом случае просто ничего не писал, вы бы сделали 'cat * (N^/)/dev/null'. * N * означает: замените шаблон glob пустой строкой, если файлы не совпадают. – user1934428

ответ

2

Любое выражение, как * относится только к самому имени файла, а не тип. Если у вас нет четкого соглашения об именах (например, все файлы имеют расширение, каталоги никогда не работают), будет сложно различать файлы и каталоги на основе их имени.

Конечный / не является частью названия.

Быстрый и грязный раствор:

cat * 2>/dev/null 

Это дополнение просто подавляет все сообщения об ошибках. (Фактически, он перенаправляет их в пустоту.)

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

for f in *; do 
    if [[ -f $f ]]; then 
     cat $f 
    fi 
done 

Что можно записать в одну строку:

for f in *; do if [[ -f $f ]]; then cat $f; fi; done 

Может быть кто-то здесь есть идея получше.

+0

Это работает, но я не знаю, почему, спасибо в любом случае. Думаю, я увеличусь на bash и вернусь к этому ответу, когда у меня появятся ноу-хау. Но вы можете мне объяснить, почему моя предложенная команда не сработала? – Uuser

+0

Я отредактировал свой ответ, чтобы подробнее рассказать о том, что я делаю. – chw21

+0

Я дам вам краткий пример. У меня есть 3 файла: 'file1', 'file2', 'file3'. Чтобы получить «файл3», вы можете использовать 'cat * [3]', чтобы получить противоположность тому, что вы можете использовать 'cat * [! 3]', с первой командой вы получите «file3» со вторым вы 'получите' file1 'и' file2 '. Вернуться к моему вопросу: 'cat * /' будет возвращать только ошибки, потому что ссылались только на каталоги. Теперь наоборот: ссылаться только на «не-каталоги» (= файлы). Я буду использовать 'cat * [! /]', Но это странно не работает. Это моя точка зрения, я надеюсь, что теперь это станет понятным. – Uuser

4
find -maxdepth 1 -type f -exec cat {} + 

Edit:

Чтобы игнорировать скрытые файлы

find -maxdepth 1 -type f -name '[!.]*' -exec cat {} + 

Ссылка: Exclude hidden files when searching with Unix/Linux find?

+1

Конечно, вы можете использовать 'find' для этого. Но разве вы не используете кувалду, чтобы взломать орех? – chw21

+2

Также примечание: Это находит скрытые файлы. Это может быть то, что вы хотите, возможно, это не так. – chw21

+1

@ chw21 хорошая точка зрения о скрытых файлах, чего можно избежать, добавив '-not -path './.*'' ... при использовании 'find' это команда, созданная для поиска файлов, поэтому я не подумайте, что здесь неправильный инструмент – Sundeep

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

  • Нет связанных вопросов^_^