我主要想从特定文件夹中选择最新的转储文件,这样我就可以存储在变量中并使用导入脚本导入
我想列出特定的特定文件,我试过:
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,但无法使其工作)
答案 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