Як відкрити всі файли, що є результатом команди ls?


10

Я хотів би відкрити всі текстові файли, що є результатом команди ls, за допомогою текстового редактора. Як це зробити?

Відповіді:


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, мій улюблений редактор.

Якщо ваш редактор прийме одночасно один файл і вам потрібно зберегти редактори спайвінгу, вам потрібно буде використовувати варіант xargsабо forциклу у відповіді jmtd, залежно від того, використовуєте ви редактор, заснований на терміналі, для якого потрібен stdio.



@Gilles: Доречно зауважив, дякую, що вказав на очевидне, що ми всі не могли бачити. @ 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

2
Не розбирайте висновок ls! Використовуйте $EDITOR *.cабо for i in *.c; do $EDITOR "$i"; done.
Жил "ТАК - перестань бути злим"

Хороший улов - відредагований належним чином.
jmtd

Зауважте, що forвипадок не вдасться для багатьох імен файлів, включаючи згортання / зміну символів пробілів.
jmtd

Як написано зараз, forвипадок буде працювати з кожним ім'ям файлу (за винятком можливо імен, що починаються з -або +з деякими редакторами; це for i in ./*.cбуде виправлено).
Жил "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.