2016-04-14 11 views
1

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

я получаю:

AdvDataStructures.text.ref: ASCII text 
makefile:     ASCII make commands text 
makelib:     ASCII English text 
README.txt:     ASCII Pascal program text 
shell3_2016.sh:    ASCII text 
shell3_2016.sh~:   ASCII text 
smallTestDir:    directory 
smallTestDir.text.out:  empty 
smallTestDir.text.ref:  ASCII text 
testarg0.text.ref:   ASCII text 
testarg1.text.ref:   ASCII text 
testbaddir.text.ref:  ASCII text 

Когда я использую

for i in `file *` 

он читает каждое слово, разделенное пробелом для i. Мне нужно, чтобы он читался в каждой строке как: AdvDataStructures.text.ref: текст ASCII, поэтому я могу просмотреть его для шаблона.

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

В принципе, пример того, что мне нужно сделать, читается в одной строке за раз (AdvDataStructures.text.ref: текст ASCII), если шаблон находит в нем совпадение (я знаю, как это сделать с помощью egrep) она будет ли подсчитать количество строк в файле (AdvDataStructures.text.ref)

+1

Вот почему вы [не читать строки с 'for'] (http://mywiki.wooledge.org/DontReadLinesWithFor) и почему [Bash FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) - как это сделать правильно. (Предполагая, что вы не хотите использовать «лучший» инструмент, такой как 'awk' и т. Д.) –

ответ

0

обычный способ заключается в использовании while read цикл:

file * | while read filename description; do 
    filename=${filename%:} # remove : after filename 
    ... 
done 
+0

Первый работал, спасибо вам большое! Еще один вопрос, когда вы это делаете. Знаете ли вы, как разбить имя файла на оставшуюся часть вывода? – jskozyu

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