问题:
我想通过输入$LATEST
来获取下载文件夹中的最新csv文件。当我取消引用$LATEST
时,我想看到放在那里的最后一个csv文件。
我尝试了什么:
'ls -t $DL/*.csv | head -1'
(此作品)export $LATEST='ls -t $DL/*.csv | head -1'
2.问题是它总是在运行导出时返回最新文件。 (例如old.csv
)当我添加新文件(例如new.csv
)时,我希望$LATEST
显示new.csv
而非old.csv
。
答案 0 :(得分:2)
变量不跟踪系统状态的变化。他们有价值观。这些值会一直持续到您更改它们为止。如果要对当前状态进行类似变量的访问,请使用函数。例如:
latest() {
ls -t $DL/*.csv | head -1
}
echo "The latest file is $(latest)"
if [ "new.csv" = "$(latest)" ]; then
echo "Hooray, new is latest!"
fi
附带好处是函数可以带参数。例如,如果您想使latest
函数具有通用性,但具有合理的默认值,则可以执行以下操作:
latest() {
ls -t ${1:-$DL}/*.csv | head -${2:-1}
}
latest # show the 1 latest file from $DL directory
latest /tmp # show the 1 latest file from /tmp
latest /tmp 5 # show the five latest files from /tmp
在这种情况下
答案 1 :(得分:2)
环境变量不会自动更新,只会存储值。但是你可以定义一个函数来评估每次调用它时的表达式:
function latest {
ls -t $DL/*.csv | head -1
}
现在,如果您将其放入~/.bashrc
并重新加载,则可以调用latest
来评估表达式并获得结果。
答案 2 :(得分:2)
如果您可以使用zsh
,那就容易多了:
$ latest () { print "$DL"/*.csv(om[1]) }
glob限定符om
按日期对"$DL"/*.csv
的扩展进行排序; [1]
选择排序扩展的第一个元素。
这避免了对包含换行符的文件名的任何担心,这就是为什么理论上应该避免解析ls
的输出的原因。