在另一个目录中使用ls -t和文件名

时间:2014-12-13 21:46:40

标签: shell directory ls

我试图在不同的目录而不是当前目录中列出特定文件。

看看这个简单的日志:

[johni /share/ex_data/ex4] > ls
example.c   header1.h  header3.h
example2.c  header2.h
[johni /share/ex_data/ex4] > ls -t header*
header1.h  header2.h  header3.h
[johni /share/ex_data/ex4] > cd
[johni ~] > 
[johni ~] > 
[johni ~] > ls -t header* /share/ex_

ex_data / ex_sol /
    [johni~]> ls -t header * / share / ex_data / ex4     ls:不匹配

我怎么能用那些' ls'来自另一个目录的命令/ share / ex_data / ex4目录?

谢谢!。

2 个答案:

答案 0 :(得分:2)

ls在另一个目录中:

ls -t /share/ex_header*

答案 1 :(得分:1)

如果您希望输出包括合格的目录名,那么您只需使用

即可
ls -t /share/ex_data/ex4/header*

如果您不希望包含目录名,请在调用ls之前使用更改目录的子shell(作为性能增强,它使用exec仅生成一个新的进程表条目而不是可能需要两个):

(cd /share/ex_data/ex4 && exec ls -t header*)

也就是说,如果要为脚本执行此操作 - 例如,要查找最新或最旧的文件名 - 它是bad practice to parse ls; other techniques可用于查找最新或最旧的文件(如果您只想执行此操作,则应遵循上面的后一个链接,而不是使用下面给出的更复杂的代码来提供完整的排序。)

例如,如果您有GNU find,GNU sort和bash并希望通过mtime将文件列表加载到数组中,则以下内容将适用于文件名,完全抛弃ls -t - 包括包含换行符等的名称:

filenames_by_mtime=( )
while read -r -d ' ' time && IFS= read -r -d '' filename; do
  filenames_by_mtime+=( "$filename" )
done < <(find /share/ex_data/ex4 \
           -maxdepth 1 \
           -type f \
           -name 'header*' \
           -printf '%T@ %P\0' \
         | sort -z -n)

...然后可以使用"${filenames_by_mtime[@]}"扩展此数组,或者为单个条目编制索引 - 例如,最旧的文件将是"${filenames_by_mtime[0]}"