目录中每个具有特定格式的最新文件

目录中每个具有特定格式的最新文件

我想在变量中包含具有特定格式的最新文件。

例子:在/home/test中,5个文件:

  • file_test_hadoop_20181130.csv(这是hadoop文件的最后一次修改)
  • file_test_hadoop_20181130.txt
  • file_test_hadoop_20181130.ini

  • file_test_hub_20181130.txt(这是txt文件的最后修改的)

  • file_test_hub_20181130.csv
  • 文件_test_hub_20181130.ini

所以我想要的结果是每种类型中最后修改的结果:HADOOP_NAME=file_test_hadoop_20181130.csv
HUB_NAME=file_test_hub_20181130.txt

所以我开始做这样的事情:

HADOOP_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max深度 1 -name "file_test_hadoop*" -printf '%f\n')

HUB_NAME=$(ls -tr /home/test | tail -n 1 | find /home/test -max深度 1 -name "file_test_hub*" -printf '%f\n')

但我得到了所有文件。

答案1

因此,您希望使用特定的命名模式检索最近修改的文件。以下命令应该适合您:

[haxiel@testvm1 ~]$ ls -1t file_test_hadoop* | head -n1
file_test_hadoop_20181130.csv

[haxiel@testvm1 ~]$ ls -1t file_test_hub* | head -n1
file_test_hub_20181130.txt

答案2

尝试使用以下命令,效果很好

ls -ltrh /home/test/file_test_hadoop*| tail -n1
ls -ltrh /home/test/file_test_hub* | tail -n1

答案3

无需尝试解析 ls 或通过管道 ls 来查找和打印,只需使用 bash 数组、shell 通配符和 YYYYMMDD 的自然排序顺序即可:

cd /home/test
hadoop_files=(file_test_hadoop*)
HADOOP_NAME=${hadoop_files[-1]}
unset hadoop_files
hub_files=(file_test_hub*)
HUB_NAME=${hub_files[-1]}
unset hub_files
cd -

这将使用与各种模式匹配的文件名列表填充临时数组变量。您需要针对根本没有文件或具有意外模式的文件(例如 file_test_hadoop9)的情况添加错误检查。

答案4

你的第一个命令

ls -tr 

,按时间正确列出文件

当你通过管道将其传输到

tail -n1

它正确选择最后一个条目,最新的文件

问题是它可能与您的文件模式匹配,也可能不匹配

当然,您的最后一个命令根本没有接收到前面命令的任何输入,因此它会按照应有的方式运行,并列出所有文件

find /home/test -maxdepth 1 -name "file_test_hadoop*" -printf '%f\n'

为了解决这个问题,我首先要从lsgrep匹配正确的模式,即

ls -tr | grep "file_test_hadoop" > File_List.txt

这将创建一个带有列表的文件,最新文件位于最底部,

tail -n1 File_List.txt

所以你的代码是HADOOP_NAME="$(tail -n1 File_List.txt)"

相关内容