11.10 7600gt ошибка отображения

Поскольку, как вы говорите, вход file должен быть именем файла. Однако вывод ls - это просто текст. То, что это список имен файлов, не меняет того факта, что это просто текст, а не расположение файлов на жестком диске.

Когда вы видите вывод, напечатанный на экране, то, что вы видите, является текстом. Является ли этот текст стихотворением или списком имен файлов, не имеет никакого значения для компьютера. Все, что он знает, это то, что это текст. Вот почему вы можете передавать вывод ls в программы, которые принимают текст в качестве входных данных (хотя вы действительно этого не должны делать):

$ ls / | grep etc
etc

Итак, чтобы использовать вывод команды, которая перечисляет имена файлов в виде текста (например, ls или find) в качестве ввода для команды, которая принимает имена файлов, вам нужно использовать некоторые трюки. Типичным инструментом для этого является xargs:

$ ls
file1 file2

$ ls | xargs wc
 9  9 38 file1
 5  5 20 file2
14 14 58 total

Как я уже говорил ранее, вы действительно не хотите разбирать вывод ls. Что-то вроде find лучше (print0 печатает \0 вместо newilne после каждого имени файла, а -0 из xargs позволяет иметь дело с таким вводом, это трюк, чтобы заставить ваши команды работать с именами, содержащими новые строки):

$ find . -type f -print0 | xargs -0 wc
 9  9 38 ./file1
 5  5 20 ./file2
14 14 58 total

У этого также есть свой способ сделать это, без необходимости xargs:

$ find . -type f -exec wc {} +
 9  9 38 ./file1
 5  5 20 ./file2
14 14 58 total

Наконец, вы также можете использовать цикл оболочки. Однако обратите внимание, что в большинстве случаев xargs будет намного быстрее и эффективнее. Например:

$ for file in *; do wc "$file"; done
 9  9 38 file1
 5  5 20 file2
0
задан 1 December 2011 в 12:43

0 ответов

Другие вопросы по тегам:

Похожие вопросы: