使用Sh列出文件

时间:2012-09-27 13:55:12

标签: bash shell unix

  

可能重复:
  Get the newest file based on timestamp

我主要想从特定文件夹中选择最新的转储文件,这样我就可以存储在变量中并使用导入脚本导入

我想列出特定的特定文件,我试过:

a= $(ls -ltr /home/oracle/testora/MAUL01*.dmp | awk '{print $9}' | tail -1)
echo $a

我希望输出为:

MAUL01.DP.09-27-2012_09_15.dmp

而不是:

/home/oracle/testora/MAUL01.DP.09-27-2012_09_15.dmp

问题: ls对我来说不适合sh(从unix工作正常) 文件名显示为路径(我使用基本名称trid,但无法使其工作)

5 个答案:

答案 0 :(得分:2)

在bash中,您可以使用${parameter##word}语法删除上一个/之前的所有内容。

您也可以使用ls -tr1,然后就不需要awk

如下所示:

a=$(ls -tr1 /home/oracle/testora/MAUL01*.dmp | tail -1)
echo ${a##*/}

答案 1 :(得分:1)

你的代码无法运作;在a=之后有一个空格。 basename可以轻松解决此问题:

name="$(basename /home/oracle/testora/MAUL01*.dmp)" # Assumes only one glob match
echo "$name"

此外,Use More Quotes™don't parse ls output。如果问题是对文件进行排序,请检查this solution

IFS= read -r -d '' -u 9 9< <(find /home/oracle/testora/ -maxdepth 1 -name 'MAUL01*.dmp' -printf '%TY-%Tm-%TdT%TH:%TM:%TS %p\0' | sort -rz)
path="${REPLY#* }"
echo "$(basename "$path")"

是的,在Bash中处理文件名很麻烦。

答案 2 :(得分:0)

我们走了(不需要那里的基本名称):

cd /home/oracle/testora
latest="$(ls -t MAUL01*.dmp | sed q)"
echo "The latest one is $latest $USER"

并使用find:

cd /home/oracle/testora
latest="$(
    find -maxdepth 1 -name 'MAUL01*.dmp' -printf '%As %f\n' |
    sort -nk1 |
    tail -1
)"

答案 3 :(得分:0)

试试这个:

a=$(ls -ltr /home/oracle/testora/MAUL01*.dmp | awk '{print $9}' | tail -1)
echo $(basename $a)

答案 4 :(得分:0)

通过参数扩展轻松(安全)完成;不需要任何ls(这是危险的,并且在操作系统之间表现不同)或find(除非与-print0和一些技巧一起使用以处理NUL分隔的流,否则这也是危险的)。这是POSIX sh兼容版本:

set -- /home/oracle/testora/MAUL01*.dmp
for filename; do
  echo "${filename##*/}"
done

如果您正在使用bash,则可以将glob的输出存储在数组中,从而不会覆盖$@

shopt -s nullglob
filenames=( /home/oracle/testora/MAUL01*.dmp )
for filename in "${filenames[@]}"; do
  echo "${filename##*/}"
done

如果您只想过滤最新的文件,请参阅http://mywiki.wooledge.org/BashFAQ/003