Я хотел бы открыть все текстовые файлы, которые являются результатом команды ls, используя текстовый редактор. Как мне это сделать?
Я хотел бы открыть все текстовые файлы, которые являются результатом команды ls, используя текстовый редактор. Как мне это сделать?
Ответы:
Жиль совершенно прав , lsэто действительно плохой пример, потому что расширение имени файла можно сделать намного проще в командной строке, не используя его lsвообще! Если ваши так называемые «текстовые файлы» имеют расширения имен файлов для их идентификации, вы можете сделать что-то вроде этого:
editor-command *.txt
Для демонстрации техники давайте рассмотрим более сложный пример, который нельзя сделать, просто сопоставив имя файла, и открываем файлы на основе содержимого, а не только имени файла. Допустим, вы хотели открыть все файлы, которые содержали строку «content-type».
Предполагая, что ваш редактор будет принимать несколько имен файлов и открывать их все одновременно в отдельных буферах или последовательно обрабатывать их, вы можете просто запустить:
editor-command $(grep -i content-type)
Теперь вернемся к исходному вопросу. Допустим, вы не знаете, являются ли они текстовыми файлами или не основаны на их именах. Затем вам нужно будет использовать другую программу для их идентификации, а затем открыть их на основе этих данных. Программа fileскажет вам, что это за файл, и вы можете выполнить поиск по этому списку только для текстовых файлов, а затем открыть только соответствующие имена файлов, например:
editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)
Вывод цепочки команд внутри $()конструкции будет использоваться в качестве аргументов для редактора. Я иногда делаю это в два этапа. Скажем, я просматриваю некоторый набор файлов и получаю список всех xml-файлов, содержащих строку «content-type»
find -type f -iname '*xml' | xargs grep -Hi 'content-type' | cut -d: -f1
... и решил, что хочу их открыть. Затем я использую последний ярлык истории команд и делаю это:
vim $(!!)
... чтобы открыть все результаты предыдущей команды в vim, мой любимый редактор.
Если ваш редактор будет принимать только один файл за раз, и вам нужно продолжать вызывать редакторы, вам нужно будет использовать вариант цикла xargsor или forв ответе jmtd в зависимости от того, используете ли вы редактор на основе терминала, которому нужен stdio.
Чтобы открыть все файлы, называемые чем-то .txt(то есть *.txt) в текущем каталоге:
$EDITOR *.txt
где $EDITORваш любимый редактор, например gedit *.txt, nano *.txt, vim *.txt, emacs *.txtили любой другой . Используйте только *для сопоставления всех файлов в текущем каталоге.
Обратите внимание, что lsкоманда не участвует. Задача lsсостоит не в том, чтобы отобразить список файлов, хотя это происходит, когда вы вызываете его в каталоге. Где lsполезно это для отображения атрибутов файла (время изменения, разрешения, размер и т. Д.). Чтобы просто что-то сделать с кучей файлов, соответствующих определенному шаблону, достаточно глобусов оболочки .
Достаточно продвинутые редакторы позволяют вам делать это изнутри. Например, в Emacs просто используйте обычную команду открытия файла ( C-x C-f) и введите *.txt.
Если вы также хотите сопоставить файлы в подкаталогах, в zsh или bash ≥4, вы можете использовать $EDITOR **/*.txt.
Это зависит от некоторых нюансов вашего текстового редактора. Продвинутые редакторы, вероятно, могут обрабатывать открытие нескольких файлов из командной строки в одном экземпляре. Но скажем, например, что ваш редактор ($ EDITOR в моих примерах ниже) может открывать только по одному за раз. Вы должны направить вывод соответствующего findв xargs. Это также зависит от того, что $ EDITOR не принимает TTY (поэтому, используя графический)
find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR
Если вы хотите использовать консольный редактор, цикл оболочки может быть более подходящим, но если он не удастся для многих необычных имен файлов (путем свертывания или замены пробельных символов и различных других вещей):
for i in *.c; do $EDITOR "$i"; done
forрегистр не удастся для многих имен файлов, включая свертывание / изменение пробельных символов.
forкейс будет работать с каждым именем файла (за исключением, возможно, имен, начинающихся с -или +с некоторыми редакторами; for i in ./*.cэто исправит).
editor-command *.cssи т. Д.