使用FZF列出按日期排序的git文件(并在bash中设置默认值)

时间:2018-06-22 07:51:43

标签: bash git fzf

我想使用fzf列出git中的所有文件,并按修改日期排序。 (我在vim中使用此输出)

此命令似乎有效:

(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/nul

但是如何将其作为默认的FZF命令呢? 我试过了,但是变量FZF_DEFAULT_COMMAND仍然为空:

export FZF_DEFAULT_COMMAND='
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'

也许我需要逃脱一些东西?

编辑:这是我现在使用的命令:

export FZF_DEFAULT_COMMAND='(git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- "$file") $file; done | sort -r | awk {"print \$3"}) 2> /dev/null'

1 个答案:

答案 0 :(得分:1)

fzf使用/bin/sh(Posix shell)执行命令。即使/bin/sh链接到/bin/bash,它也将在非posix功能上失败(例如您的情况下的流程替换)。您可以实施 GNU / bash 支持:

export FZF_DEFAULT_COMMAND='set +o posix
    (while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done < <(git ls-tree -r --name-only HEAD) | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'

如果您没有将bash链接到/bin/sh,则必须摆脱流程替换:

export FZF_DEFAULT_COMMAND='
    (git ls-tree -r --name-only HEAD)|(while read file; do echo $(git log --pretty=format:%ad -n 1 --date=raw -- $file) $file; done | sort -k1,1n | awk {"print \$3"}) 2> /dev/null'