Измените эту строку в /etc/hosts:
127.0.1.1 your-old-hostname
на:
127.0.1.1 your-new-hostname
Поскольку, как вы говорите, вход 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
Он не «перенаправляет» вывод, а выводит результат программы и использует его как вход, а файл не принимает входные данные, а имена файлов в качестве аргументов, которые затем проверяются. Переопределения не передают эти имена файлов в качестве аргументов, которые ни один из них не выполняет, а что дальше.
Что вы можете сделать, это прочитать имена файлов из файла с опцией --files-from, если у вас есть файл, список которого все файлы, которые вы хотите протестировать, иначе просто передайте пути к вашим файлам в качестве аргументов.
Принятый ответ объясняет, почему команда pipe не работает сразу, а с помощью команды file * предлагает простое, простое решение.
Я хотел бы предложить еще одну альтернативу, которая может пригодиться в какой-то момент. Трюк использует символ обратного хода (`). Здесь подробно рассмотрен обратный ход. Короче говоря, он принимает вывод команды, заключенной в backticks, и заменяет ее как строку на оставшуюся команду.
Итак, find `ls` выведет вывод команды ls и заменит его как аргументы для команды find. Это длиннее и сложнее, чем принятое решение, но варианты этого могут быть полезны в других ситуациях.
Выход ls через канал представляет собой сплошной блок данных с 0x0a, разделяющим каждую строку, то есть символ перевода строки, и file получает это как один параметр, где он ожидает, что несколько символов будут работать на одном из time.
Как правило, никогда не используйте ls для генерации источника данных для других команд - в один прекрасный день он будет транслироваться в rm, а затем у вас проблемы!
Лучше использовать цикл, например for i in *; do file "$i" ; done, который будет выдавать желаемый результат. Кавычки существуют в случае имен файлов с пробелами.
Если вы хотите использовать канал для подачи file, используйте параметр -f, за которым обычно следует имя файла, но вы также можете использовать один дефис - для чтения из stdin, поэтому
[ f1]Трюк с дефисом - работает с большим количеством стандартных служебных команд командной строки (хотя иногда это --), поэтому всегда стоит попробовать.
Инструмент xarg намного более мощный и в большинстве случаев нужен только в том случае, если список аргументов слишком длинный (подробнее см. в этом сообщении).
Он использует команду, как показано ниже
ls | xargs file
Это будет работать лучше для меня
Это также должно работать:
file $(ls)
, также обсуждаемое здесь: https://unix.stackexchange.com/questions/5778/whats-the-difference-between-stuff-and-stuff