我经常需要处理目录中的最新文件。
通常我这样做:
ls -rt
然后在vim或更低版本中打开最后一个文件。
现在我想生成一个别名或函数,比如
lastline() {ls -rt | tail -n1}
# or
alias lastline=$(ls -rt | tail -n1)
调用lastline输出目录中的最新文件,这很好。 但是打电话给
less lastline
想要打开不存在的文件“lastline”。
如何在没有大量输入$()或``的情况下使bash执行函数或别名? 或者还有其他方法可以达到相同的效果吗?
感谢您的帮助。
答案 0 :(得分:2)
您正在解析ls
,这非常糟糕。此外,如果上次修改的“文件”是目录,您将less
/ {{}}目录。
因此,您需要一种强大的方法来确定当前目录中的最后一个修改过的文件。您可以使用以下帮助函数(您将vim
放入):
.bashrc
然后你可以定义另一个last_modified_regfile() {
# Finds the last modified regular file in current directory
# Found file is in variable last_modified_regfile_ret
# Returns a failure return code if no reg files are found
local file
last_modified_regfile_ret=
for file in *; do
[[ -f $file ]] || continue
if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then
last_modified_regfile_ret=$file
fi
done
[[ $last_modified_regfile_ret ]]
}
最后找到的文件的函数:
vim
你甚至可以vimlastline() {
last_modified_regfile && vim -- "$last_modified_regfile_ret"
}
获取可选参数:它将找到最后修改的常规文件的目录:
last_modified_regfile
然后你甚至可以相应地改变last_modified_regfile() {
# Finds the last modified regular file in current directory
# or in directories given as arguments
# Found file is in variable last_modified_regfile_ret
# Returns a failure return code if no reg files are found
local file dir
local save_shopt_nullglob=$(shopt -p nullglob)
shopt -s nullglob
(( $# )) || set .
last_modified_regfile_ret=
for dir; do
dir=${dir%/}
[[ -d $dir/ ]] || continue
for file in "$dir"/*; do
[[ -f $file ]] || continue
if [[ -z $last_modified_regfile_ret ]] || [[ $file -nt $last_modified_regfile_ret ]]; then
last_modified_regfile_ret=$file
fi
done
done
$save_shopt_nullglob
[[ $last_modified_regfile_ret ]]
}
:
vimlastline
答案 1 :(得分:0)
使用命令替换如下:
lastline() { ls -rt | tail -n1; }
less "$(lastline)"
或将其传递给xargs
:
lastline | xargs -I {} less '{}'