Я хотів би відкрити всі текстові файли, що є результатом команди 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
або 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
і т. Д.