2014-11-24 30 views
0

我正在尝试编写一个脚本,该脚本将显示该脚本执行目录中最早的文件的名称。Bash脚本来查找并显示最旧的文件

这是我到目前为止有:

#!/bin/bash 
for arg in $* 
do 
oldest=$1 
if [[ $arg -ot $oldest ]] 
then 
    oldest=$arg 
fi 
done 

echo "Oldest file: $oldest" 

我不知道如何以递增到下一个文件来检查它是否是旧的

例如:

oldest=$2 
oldest=$3 
etc.. 

试图在给定以下参数的bash shell中运行此脚本:

myScript `ls -a` 

我得到的结果是:

Oldest File: . 
+0

'在$ * ARG'是越野车 - 与包含空格或引用通配符来看看为什么参数尝试。 '对于“$ @”'中的arg或者'对于arg'(默认行为是对''@ @“''进行迭代)是正确的选择。当然,所有这些都假设你正在迭代命令行参数,而不是文件。 – 2014-11-24 03:08:17

+0

...对文件进行迭代,它在*中用于arg,或许在循环内部带有一个'[-d“$ arg”] && continue'来跳过目录。 – 2014-11-24 03:10:35

回答

1

您可以使用此功能找到最旧的文件/目录中的任何目录:

oldest() { 
    oldf= 
    for f in *; do 
     # not a file, ignore 
     [[ ! -f "$f" ]] && continue 
     # find oldest entry 
     [[ -z "$oldf" ]] && oldf="$f" || [[ "$f" -ot "$oldf" ]] && oldf="$f" 
    done 
    printf '%s\n' "$oldf" 
} 

,并调用它的任何目录:

oldest 
6

ls程序有一个按时间排序的选项,您可以从该输出抓取最后一个文件::

# These are both "wun", not "ell". 
#    v   v 
oldest="$(ls -1t | tail -1)" 

如果你想避免的目录,你可以事先带他们出去:

# This one's an "ell", this is still a "wun". 
       v       v 
oldest="$(ls -lt | grep -v '^d' | tail -1 | awk '{print $NF}')" 

我一般不会主张解析ls输出,但它的优良的快速和肮脏的工作,如果你了解它的限制。


如果你想有一个脚本,甚至会连续工作谁坚持把控制字符在它们的文件名:-)然后this page有一些更好的选择,包括疯子:

unset -v oldest 
for file in "$dir"/*; do 
    [[ -z $oldest || $file -ot $oldest ]] && oldest=$file 
done 

虽然我” d建议下面的链接了解为什么ls解析一般被认为是一个坏主意(因此为什么它可以在有限的情况下有用,例如当你可以保证所有的文件都是例如3210品种)。那里有一些有用的信息。

+2

请参阅http://mywiki.wooledge.org/ParsingLs,了解为什么这是一个糟糕的主意,而http://mywiki.wooledge.org/BashFAQ/003是最佳实践替代方案。 – 2014-11-24 03:07:01

+0

Thx,@Charles在其上添加了该链接和一个选项,这似乎满足了这里的特定要求。 – paxdiablo 2014-11-24 03:22:34

0

您可以使用find命令: find -type f -printf '%T+ %p\n' | sort | head -1

+1

修改为'{IFS = read -r -d''time; IFS =读取-r -d''名称; } <<(find -type f -printf'%T +%p \ 0'| sort -z)'你可以使用所有可能的文件名,包括带有换行符的文件名(你当前的代码无法处理)。当然,需要GNU排序,但是因为您已经依赖于GNU扩展找到... – 2014-11-24 04:07:58