我正在使用 zsh 根据“原始日期/时间”exif 属性更改图像修改时间。
为此我执行一个命令:
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
其中 logfile 是包含不正确属性值等的 exiftool 消息的文件。
现在第二个代码片段的最后一个命令不起作用,因为我需要像第一个代码片段那样进行 sed 替换。
我的问题是:在 zsh vi 交互模式下,如何才能访问历史记录中的第一个代码片段,而不丢失当前命令的内容?
我想象在 vi 中编辑当前命令(当我在 zsh vi 控制模式下按下“v”字符时就可以做到这一点),列出历史命令并选择其中一个,它将被粘贴在下面的行中。
答案1
有zsh-cmd-建筑师专门为执行您描述的操作而创建。它显示您当前的命令,允许左右移动命令块,还显示可搜索的历史记录,您可以从中选择命令块。
答案2
您正在使用 vi 模式下的 zsh。
为了解决您的问题,我们将问题分为两部分
1. part - 打印与模式匹配的命令历史记录行
为此,我们创建一个~/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 的命令,然后向其中添加 ("pattern") 并按 Enter,结果就会在上面的窗口中打开。从那里,您可以轻松地将所需的行复制到第二个窗口。
C-w,q
关闭窗口
C-w,j
并转到下面的窗口。