使用f = $(cd dir | ls -t | head)获取目录中最新文件的路径,而不遵循“ dir”

时间:2018-10-09 12:25:53

标签: bash sh

我想使用代码file=$(cd '/path_to_zip_file' | ls -t | head -1)的这部分从路径获取文件(zip文件)。相反,我在运行该文件的目录中找到了.sh文件。

为什么我不能从/path_to_zip_file归档

下面是我在.sh文件中的代码

file=$(cd '/path_to_zip_file' | ls -t | head -1)
last_modified=`stat -c "%Y" $file`;
current=`date +%s`
echo $file

if [ $(($current-$last_modified)) -gt 86400 ]; then
        echo 'Mail'
else
        echo 'No Mail'
fi;

1 个答案:

答案 0 :(得分:4)

如果您要使用ls -t | head -1(不应该使用),则cd需要作为优先命令进行更正(发生在之前 {{1 }}发生),而不是管道组件(与平行 ls运行,并且其stdout连接到ls的stdin):

ls

一种更好的做法可能是:

set -o pipefail # otherwise, a failure of ls is ignored so long as head succeeds
file=$(cd '/path_to_zip_file' && ls -t | head -1)

要了解newest_file() { local result=$1; shift # first, treat our first arg as latest while (( $# )); do # as long as we have more args... [[ $1 -nt $result ]] && result=$1 # replace "result" if they're newer shift # then take them off the argument list done [[ -e $result || -L $result ]] || return 1 # fail if no file found printf '%s\n' "$result" # more reliable than echo } newest=$(newest_file /path/to/zip/file/*) newest=${newest##*/} ## trim the path to get only the filename printf 'Newest file is: %s\n' "$newest" 语法,请参见the bash-hackers' wiki on parameter expansion

有关在脚本中使用${newest##*/}的危险(显示给人类的输出除外)的危险性的更多信息,请参见ParsingLs

启动BashFAQ #99如何从目录中获取最新(或最旧)文件?-和BashFAQ #3如何排序或比较基于某些元数据属性(最新/最旧的修改时间,大小等)的文件?)可以在较大范围内讨论此问题。