0

可能重复:
根据时间戳获取最新文件

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

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

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 可以正常工作)文件名显示为路径(我使用 basename,但无法使其工作)

4

5 回答 5

2

在 bash 中,您可以使用${parameter##word}语法删除最后一个/.

你也可以用ls -tr1,然后就不需要了awk

如下所示:

a=$(ls -tr1 /home/oracle/testora/MAUL01*.dmp | tail -1)
echo ${a##*/}
于 2012-09-27T14:08:32.273 回答
1

您的代码无法运行;后面有一个空格a=basename轻松解决此问题:

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

此外,使用 More Quotes™</a> 并且不要解析ls输出。如果问题是对文件进行排序,请检查此解决方案

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 中处理文件名很麻烦。

于 2012-09-27T14:21:28.703 回答
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

于 2012-09-27T14:46:33.817 回答
0

我们开始吧(那里不需要basename):

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

并找到:

cd /home/oracle/testora
latest="$(
    find -maxdepth 1 -name 'MAUL01*.dmp' -printf '%As %f\n' |
    sort -nk1 |
    tail -1
)"
于 2012-09-27T13:59:39.547 回答
0

尝试这个:

a=$(ls -ltr /home/oracle/testora/MAUL01*.dmp | awk '{print $9}' | tail -1)
echo $(basename $a)
于 2012-09-27T14:01:11.687 回答