Как открыть все файлы, которые являются результатом команды ls?

10

Я хотел бы открыть все текстовые файлы, которые являются результатом команды ls, используя текстовый редактор. Как мне это сделать?

c0smikdebris
источник

Ответы:

12

Жиль совершенно прав , 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.

Калеб
источник
4
Не разбирайте вывод ls! Использование editor-command *.cssи т. Д.
Жиль "ТАК - перестань быть злым"
@ Жиль: должным образом отметил, спасибо за указание на очевидное, что мы все не могли видеть. @ c0smikdebris Обратите внимание, что я просто полностью переписал свой ответ, включая случай, если у вас нет очевидного способа сопоставления того, какие файлы представляют собой текст только по их имени.
Калеб
$ () - это то, что я действительно искал. Я должен был упомянуть, что я использую ls в качестве примера здесь. +1 к обоим ответам.
c0smikdebris
«мой любимый редактор». Не нужно указывать, @Caleb, так как это ясно более или менее с самого начала ответа, ахахах! Лучший редактор когда-либо!
Энрико Мария Де Анжелис
4

Чтобы открыть все файлы, называемые чем-то .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.

Жиль "ТАК - прекрати быть злым"
источник
Это действительно зависит от редактора. Нет никакой гарантии, что все редакторы будут рассматривать все свои бесплатные аргументы командной строки как открываемые файлы и не поддерживают открытие более одного файла за раз.
JMTD
2

Это зависит от некоторых нюансов вашего текстового редактора. Продвинутые редакторы, вероятно, могут обрабатывать открытие нескольких файлов из командной строки в одном экземпляре. Но скажем, например, что ваш редактор ($ 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
jmtd
источник
2
Не разбирайте вывод ls! Используйте $EDITOR *.cили for i in *.c; do $EDITOR "$i"; done.
Жиль "ТАК - перестань быть злым"
Хороший улов - отредактировано соответственно.
JMTD
Обратите внимание, что forрегистр не удастся для многих имен файлов, включая свертывание / изменение пробельных символов.
JMTD
Как написано сейчас, forкейс будет работать с каждым именем файла (за исключением, возможно, имен, начинающихся с -или +с некоторыми редакторами; for i in ./*.cэто исправит).
Жиль "ТАК - перестань быть злым"