列出文件,按时间排序,仅当前缀与文件中的行匹配时

时间:2018-04-04 15:06:11

标签: shell unix

我有一个每行包含2个字符的文件,如下所示:

RU    
8A   
1C

如何将这些字符读入unix命令(在这种情况下,形成ls -t的参数列表)?我想要这样的东西:

ls -t RU* 8A* 1C*   

1 个答案:

答案 0 :(得分:1)

如果您想要三次单独运行ls

while IFS= read -r line; do
  ls -t "$line"*
done <input_file.txt

如果您只想进行一次运行,并将所有内容整合在一起:

set --
while IFS= read -r line; do
  [ -n "$line" ] || continue
  set -- "$@" "$line"*
done <input_file.txt
ls -t "$@"

请注意,ls -t是一个不可靠的工具。如果您传递的文件名多于单个命令调用的文件名,那么它将无法工作(并尝试制作它使用xargs工作将在输出中为您提供多个单独排序的列表。如果在具有GNU工具的平台上(bash,以及GNU findsort),请考虑以下内容:

#!/usr/bin/env bash

predicates=( -false )
while IFS= read -r line; do
  predicates+=( -o -name "${line}*" )
done <input_file.txt

while IFS= read -r -d' ' mtime && IFS= read -r -d '' filename; do
  echo "Processing file $filename with timestamp $mtime"
done < <(find . -maxdepth 1 '(' "${predicates[@]}" ')' -printf '%T@ %P\0' | sort -z -n)

有用的链接: