Я хотел бы открыть все текстовые файлы, которые являются результатом команды 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, мой любимый редактор.
Если ваш редактор будет принимать только один файл за раз, и вам нужно продолжать вызывать редакторы, вам нужно будет использовать вариант цикла xargs
or или for
в ответе jmtd в зависимости от того, используете ли вы редактор на основе терминала, которому нужен stdio.
editor-command *.css
и т. Д.Чтобы открыть все файлы, называемые чем-то
.txt
(то есть*.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 (поэтому, используя графический)Если вы хотите использовать консольный редактор, цикл оболочки может быть более подходящим, но если он не удастся для многих необычных имен файлов (путем свертывания или замены пробельных символов и различных других вещей):
источник
$EDITOR *.c
илиfor i in *.c; do $EDITOR "$i"; done
.for
регистр не удастся для многих имен файлов, включая свертывание / изменение пробельных символов.for
кейс будет работать с каждым именем файла (за исключением, возможно, имен, начинающихся с-
или+
с некоторыми редакторами;for i in ./*.c
это исправит).