Chciałbym otworzyć wszystkie pliki tekstowe będące wynikiem polecenia ls przy użyciu edytora tekstu. Jak mam to zrobic?
Chciałbym otworzyć wszystkie pliki tekstowe będące wynikiem polecenia ls przy użyciu edytora tekstu. Jak mam to zrobic?
Odpowiedzi:
Gilles ma dokładnie rację , ls
to 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 ls
z 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 file
powie 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 xargs
albo for
w odpowiedzi jmtd, w zależności od tego, czy używasz edytora opartego na terminalu, który wymaga stdio.
Aby otworzyć wszystkie pliki o nazwie coś .txt
(tj. *.txt
) W bieżącym katalogu:
$EDITOR *.txt
gdzie $EDITOR
jest Twój ulubiony edytor, np gedit *.txt
, nano *.txt
, vim *.txt
, emacs *.txt
lub cokolwiek innego. Użyj tylko, *
aby dopasować wszystkie pliki w bieżącym katalogu.
Zauważ, że ls
polecenie nie jest zaangażowane. Zadanie ls
polega na tym, aby nie wyświetlać listy plików, chociaż dzieje się tak, gdy wywołujesz ją w katalogu. Gdzie ls
jest 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
.
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 find
do 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
for
sprawa nie powiedzie się w przypadku wielu nazw plików, w tym zwijania / zmiany białych znaków.
for
skrzynka 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 ./*.c
to naprawi).
editor-command *.css
itp.