저는 '날짜/시간 원본' EXIF 속성에 따라 이미지 수정 시간을 변경하기 위해 zsh를 사용하고 있습니다.
이를 위해 나는 한 가지 명령을 내린다:
PDATE=$(exiftool -p '$DateTimeOriginal' $PIC | sed 's/[: ]//g') touch -t $(echo $PDATE | sed 's/\(..$\)/\.\1/') $PIC
'날짜/시간 원본' 값이 잘못된 이미지가 있어서 해당 이미지가 처리되지 않았습니다.
그래서 저는 이미지 파일 이름에서 날짜를 가져오는 중입니다.
for i in `grep -E -o 'IMG\S+jpg' logfile`; do
dte=$(echo $i | grep -E -o '20.{13}' | tr -d '_');
touch -t $dte $i;
done
여기서 로그 파일은 잘못된 값 등의 EXIFtool 메시지가 포함된 파일입니다.
이제 첫 번째 스니펫에서와 같이 sed 대체를 수행해야 하기 때문에 두 번째 스니펫 마지막 명령이 작동하지 않습니다.
내 질문은: zsh vi 대화형 모드에 있는 동안 현재 명령의 내용을 잃지 않고 기록에 있는 첫 번째 조각에 어떻게 액세스할 수 있습니까?
나는 vi에서 현재 명령을 편집하고(zsh vi 제어 모드에서 'v' 문자를 누를 때 할 수 있듯이) 기록 명령을 나열하고 그 중 하나를 선택하면 아래 줄에 붙여넣을 것이라고 상상합니다.
답변1
있다zsh-cmd-건축가설명하는 작업을 수행하기 위해 특별히 만들어졌습니다. 현재 명령을 표시하고 해당 명령 블록을 왼쪽과 오른쪽으로 이동할 수 있으며 검색 가능한 기록도 표시하여 명령 블록을 선택할 수 있습니다.
답변2
vi 모드에서 zsh를 사용하고 있습니다.
문제를 해결하기 위해 문제를 두 부분으로 나눕니다.
1. 부분 - 패턴과 일치하는 명령 기록 행 인쇄
이를 위해 다음을 포함하는 파일을 만듭니다 ~/bin/history-print-regexp.sh
.
#!/bin/zsh
# command 'regular-expression' number-of-lines(counting from the end of the file)
nmbr=15
if [ "$#" -eq 2 ]; then
nmbr=$2
fi
if [ "$#" -eq 0 ]; then
echo "You need at least one argument"
echo "Usage command regexp outputlinesCount"
fi
#tac - reverse print , grep -E - use extended regexp, cut -d ';' use ; as delimiter
#and print second field (-f 2), uniq -u print only unique lines
tac ~/.histfile | grep -E $1 | cut -d ';' -f 2 | uniq -u | head -n $nmbr
이제 현재 명령과 함께 작동하도록 해야 합니다. 이를 위해 우리는 다음을 수행합니다.
zsh vi 일반 모드에 있는 동안 버튼을 두 번 누르면 v
vi 창이 열립니다.
~/.vimrc 파일에 이 함수를 넣습니다.
function! ShowHistoryMatching(pattern)
10new
exe 'r!' . "history-print-regexp.sh " . a:pattern
call cursor(1,1)
endfunction
:cnoremap ch call ShowHistoryMatching
이 스크립트를 사용하는 방법은 zsh total vi 편집기에서 현재 명령을 편집하는 동안 :ch
:call ShowHistoryMatching으로 확장된 명령을 누르고 여기에 ("패턴")을 추가하고 Enter를 누르면 결과가 위 창에 열립니다. 거기에서 원하는 줄을 두 번째 창에 쉽게 복사할 수 있습니다.
C-w,q
창을 닫으면
C-w,j
아래 창으로 이동합니다.