Jak mogę otworzyć wszystkie pliki, które są wynikiem polecenia ls?

10

Chciałbym otworzyć wszystkie pliki tekstowe będące wynikiem polecenia ls przy użyciu edytora tekstu. Jak mam to zrobic?

c0smikdebris
źródło

Odpowiedzi:

12

Gilles ma dokładnie rację , lsto naprawdę zły przykład, ponieważ rozszerzanie nazw globalnych nazw plików można wykonać o wiele łatwiej w wierszu poleceń bez konieczności korzystania lsz nich! Jeśli tak zwane „pliki tekstowe” mają rozszerzenia nazw plików umożliwiające ich identyfikację, możesz zrobić coś takiego:

editor-command *.txt

Aby zademonstrować technikę, skorzystajmy z bardziej skomplikowanego przykładu, którego nie można było zrobić tylko z dopasowaniem nazwy pliku i otwieraniem plików na podstawie zawartości zamiast samej nazwy pliku. Powiedzmy, że chcesz otworzyć wszystkie pliki, które zawierały ciąg „content-type”.

Zakładając, że Twój edytor zaakceptuje wiele nazw plików i otworzy je wszystkie naraz w osobnych buforach lub kolejno będzie je obsługiwał, możesz po prostu uruchomić:

editor-command $(grep -i content-type)

Wracając do pierwotnego pytania, powiedzmy, że nie wiesz, czy są to pliki tekstowe, czy nie na podstawie ich nazw. Będziesz wtedy musiał użyć innego programu do ich identyfikacji, a następnie otwórz je na podstawie tych danych. Program filepowie ci, co to za plik, i możesz grep tę listę tylko dla plików tekstowych, a następnie otworzyć tylko pasujące nazwy plików, takie jak:

editor-command $(file -ni * | grep 'text/plain' | cut -d: -f1)

Dane wyjściowe łańcucha poleceń wewnątrz $()konstrukcji zostaną wykorzystane jako argumenty edytora. Czasami robię to w dwóch etapach. Powiedzmy, że przeglądam jakiś zestaw plików i otrzymuję listę każdego pliku xml zawierającego ciąg „content-type”

find -type f -iname '*xml' | xargs grep -Hi 'content-type' |  cut -d: -f1

... i zdecyduj, że chcę je otworzyć. Następnie używam skrótu historii ostatnich poleceń i robię to:

vim $(!!)

... aby otworzyć wszystkie wyniki poprzedniego polecenia w vim, moim ulubionym edytorze.

Jeśli twój edytor akceptuje tylko jeden plik na raz i musisz ciągle uruchamiać edytory, będziesz musiał użyć wariantu albo pętli xargsalbo forw odpowiedzi jmtd, w zależności od tego, czy używasz edytora opartego na terminalu, który wymaga stdio.

Caleb
źródło
4
Nie analizuj wyniku ls! Użyj editor-command *.cssitp.
Gilles „SO- przestań być zły”
@Gilles: Należy zauważyć, dziękuję za wskazanie oczywistego faktu, którego wszyscy nie widzieliśmy. @ c0smikdebris Zauważ, że po prostu całkowicie przepisałem swoją odpowiedź, w tym przypadek, jeśli nie masz oczywistego sposobu dopasowania, które pliki są tekstem tylko według ich nazwy.
Caleb
$ () właśnie tego szukałem. powinienem wspomnieć, że używam ls jako przykładu tutaj. +1 do obu odpowiedzi.
c0smikdebris
„mój ulubiony redaktor”. Nie trzeba podawać @Caleb, ponieważ od początku odpowiedzi jest mniej więcej jasne, ach! Najlepszy edytor w historii!
Enrico Maria De Angelis
4

Aby otworzyć wszystkie pliki o nazwie coś .txt(tj. *.txt) W bieżącym katalogu:

$EDITOR *.txt

gdzie $EDITORjest Twój ulubiony edytor, np gedit *.txt, nano *.txt, vim *.txt, emacs *.txtlub cokolwiek innego. Użyj tylko, *aby dopasować wszystkie pliki w bieżącym katalogu.

Zauważ, że lspolecenie nie jest zaangażowane. Zadanie lspolega na tym, aby nie wyświetlać listy plików, chociaż dzieje się tak, gdy wywołujesz ją w katalogu. Gdzie lsjest przydatna jest wyświetlenie atrybuty pliku (czas modyfikacji uprawnień, rozmiar i tak dalej). Aby po prostu zrobić coś na wiązce plików pasujących do określonego wzoru wieloznacznego, wystarczy użyć globów powłoki .

Wystarczająco zaawansowane edytory pozwalają to zrobić od wewnątrz. Na przykład w Emacsie wystarczy użyć zwykłego polecenia otwierania pliku ( C-x C-f) i wprowadzić *.txt.

Jeśli chcesz również dopasować pliki w podkatalogach, w zsh lub bash ≥4, możesz użyć $EDITOR **/*.txt.

Gilles „SO- przestań być zły”
źródło
To naprawdę zależy od edytora. Nie ma gwarancji, że wszyscy redaktorzy będą traktować wszystkie swoje wolne argumenty wiersza poleceń jako pliki do otwarcia, ani nie obsługują otwierania więcej niż jednego pliku na raz.
jmtd
2

To zależy od niektórych niuansów edytora tekstu. Zaawansowani redaktorzy prawdopodobnie poradzą sobie z otwieraniem wielu plików z wiersza poleceń w jednym wystąpieniu. Powiedzmy na przykład, że twój edytor ($ EDITOR w moich przykładach poniżej) może otwierać tylko jeden na raz. Powinieneś potokować wyjście odpowiedniego finddo xargs. Zależy to również od tego, że $ EDITOR nie przejmie TTY (więc używając graficznego)

find . -maxdepth 1 -type f -name '*.c' -print0 | xargs -r0n 1 $EDITOR

Jeśli chcesz użyć edytora konsoli, bardziej odpowiednia może być pętla powłoki, ale jeśli zawiedzie ona w przypadku wielu nietypowych nazw plików (przez zwijanie lub zastępowanie białych znaków i różne inne rzeczy):

for i in *.c; do $EDITOR "$i"; done
jmtd
źródło
2
Nie analizuj wyniku ls! Użyj $EDITOR *.club for i in *.c; do $EDITOR "$i"; done.
Gilles „SO- przestań być zły”
Dobry połów - odpowiednio zredagowany.
jmtd
Pamiętaj, że forsprawa nie powiedzie się w przypadku wielu nazw plików, w tym zwijania / zmiany białych znaków.
jmtd
Jak napisano teraz, forskrzynka będzie działać z każdą nazwą pliku (z wyjątkiem ewentualnie nazw rozpoczynających się od -lub +z niektórymi edytorami; for i in ./*.cto naprawi).
Gilles „SO- przestań być zły”