Jak wpisać kilka nazw plików przy mniejszej liczbie naciśnięć klawiszy

16

Jeśli chcę przekonwertować pdfna pngzdjęcie za pomocą imagemagick, robię coś takiego:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf this_is_a_very_long_filename_of_my_pdf_file.png

Plik pdf często ma bardzo długą nazwę z kilku powodów i chcę, aby pngplik miał tę samą nazwę oprócz rozszerzenia.

Zazwyczaj wybieram this_is_a_very_long_filename_of_my_pdf_file.pdfdwa razy i za pośrednictwem zakładki zsh-menu, a następnie zmieni pdfsię pngręcznie do drugiego argumentu.

Czy jest jednak szybszy sposób to zrobić?

student
źródło

Odpowiedzi:

23

Możesz użyć rozszerzeń nawiasów :

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.{pdf,png}
nandhp
źródło
1
Może również zauważyć automatyczne uzupełnianie nazw plików (jest obecne w Zsh, prawda?)
Ruslan
@Ruslan OP powiedział, że używa autouzupełniania. Ale wciąż miło oszczędza czas.
Cammy_the_block
5

To wywołanie mogrify spowoduje utworzenie nowego pliku png zamiast zastąpienia pliku pdf - mam nadzieję;)

mogrify -trim density 400 -format png th*.pdf

dla * .pdf użyj odpowiedniej liczby znaków, aby wybrać odpowiedni plik lub lepiej uzupełnić tabulatorem, aż uzyskasz pełną nazwę.

W ten sposób możesz utworzyć alias do całej komendy aż do parametru png.

gugu
źródło
5

Jeśli zawsze używasz tego samego polecenia z małymi odmianami (np. Nazwa pliku), możesz napisać funkcję:

pdf2png() { convert -trim -density 400 "$1" "$1:r.png" }

(ta funkcja jest specyficzna dla zsh) i dla każdego pliku twój_plik.pdf, który chcesz przekonwertować:

pdf2png your_file.pdf

Uwaga 1: Możesz napisać ten sam rodzaj funkcji dla innych powłok, ale jest to nieco bardziej złożone.

Uwaga 2: Za pomocą zsh, cytaty są użyteczne tylko wtedy, gdy SH_WORD_SPLITustawiona jest opcja (która nie jest domyślna).

vinc17
źródło
4

Rozważ użycie zmiennych do przechowywania nazw plików. Uzupełniają się również:

f="this_is_a_very_long_filename_of_my_pdf_file"
convert -trim -density 400 "$f.pdf" "$f.png"

Używam cytatów, ponieważ czasami gryzą spacje.

Istotnymi korzyściami z tego są:

  1. Możesz wykonywać dalsze operacje z wartością w $ f, wiedząc, że wskazuje ona na właściwy plik
  2. Jest to najkrótszy z chmielu, który przykleja to do cat listOfFiles | while read f; do ... ; donestruktury pętli.
  3. Często automatycznie generowane nazwy plików są bardzo podobne, a autouzupełnianie bardzo denerwuje się bardzo szybko, jeśli trzeba abc<tab>d<tab>x<tab>2<tab>itp. W ten sposób wystarczy wpisać go tylko raz, a nawet można pobrać najnowszy plik lub największy plik za pomocą skryptu takiego jak f=\ls -t | głowa -1 '', zamiast najpierw uruchomić wyszukiwanie, szukać nazwy pliku i transkrybować ją jak wyszkoloną małpę.
Phil H.
źródło
2

Możesz także użyć rozszerzenia historii, aby odnieść się do słów w bieżącym wierszu poleceń:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf !#:$:r.png
  • Oznaczenie zdarzenia !# odnosi się do wpisanego do tej pory wiersza poleceń
  • Oznaczenie słowa $ wskazuje ostatnie słowo (przed rozwinięciem)
  • Modyfikator r usuwa rozszerzenie pliku. Oznacza to także koniec tekstu, który jest zastępowany po rozszerzeniu historii.
  • .pngjest nowym rozszerzeniem. To nie należy do samego rozszerzenia.

Po uruchomieniu tego wiersza zostaje !#:$:rzastąpiony nazwą pliku pdf pomniejszoną o rozszerzenie, tworząc w ten sposób polecenie z pytania:

convert -trim -density 400 this_is_a_very_long_filename_of_my_pdf_file.pdf this_is_a_very_long_filename_of_my_pdf_file.png

Ta linia jest następnie bezpośrednio wykonywana.

Jeśli chcesz sprawdzić polecenie po rozwinięciu historii, przed wykonaniem, użyj

setopt histverify

Spowoduje to ponowne załadowanie rozwiniętej linii do bufora edycji zamiast jej wykonania.

Uwaga: W przeciwieństwie do innych rozszerzeń, rozszerzanie historii jest wykonywane przed zapisaniem polecenia w historii. Tak echo !#będzie wyglądać jak echo echoi nie jak echo !#w twoim $HISTFILE.

Adaefon
źródło
2

Użycie rozszerzenia nawiasów klamrowych nie może być pobite w tym specjalnym przykładzie. Jednak nieco bardziej elastyczny jest widget zle copy-prev-shell-word, który robi to, co sugeruje jego nazwa i jest przydatny, jeśli chcesz podobny argument jak poprzedni, którego nie można systematycznie z niego wyprowadzać.

Powiąż widżet np. Z CTRL+W:

bindkey '^W' copy-prev-shell-word

Jeśli jesteś tak leniwy jak ja, użyj tej sekwencji kluczy bind

bindkey '^W^W' copy-prev-shell-word
bindkey -s '^W' ' ^W^W'

uzyskać następujące zachowanie:

  • CTRL+Wwstawia poprzednie słowo powłoki z wiodącym pustym znakiem (stąd oszczędzasz jedno naciśnięcie klawisza!)
  • CTRL+W CTRL+W wstawia bezpośrednio poprzednie słowo powłoki
mpy
źródło