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ę , 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.
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.
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
forsprawa nie powiedzie się w przypadku wielu nazw plików, w tym zwijania / zmiany białych znaków.
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).
editor-command *.cssitp.