从最新文件中读取第一行

时间:2019-02-15 08:26:13

标签: shell

我正在研究需要从目录下最新文件中读取第一行的要求。在目录中,我可以有多个文件,但是我想从文件名中包含PPP的所有文件中读取最新文件的第一行。

我知道如何读取文件的第一行并将其写入文件

head -n 1 jsonPPPvp.txt > output.txt

但是如何从目录中所有包含PPP的文件中选择最新文件(按照时间戳)?

请提出任何建议...!

我写了一条命令

5 个答案:

答案 0 :(得分:1)

这可能不是最好的解决方案,但是它可以工作(根据最新文件,我考虑了使用最新时间戳修改的文件):

ls -ltra
total 32
drwxr-xr-x 3 allanrobert primarygroup 4096 Feb 15 17:37 ..
drwxr-xr-x 2 allanrobert primarygroup 4096 Feb 15 17:37 .
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 file2PPP2
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 other
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 file3PPP3
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 other2
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 other1
-rw-r--r-- 1 allanrobert primarygroup    6 Feb 15 17:40 file1PPP

文件内容:

cat file1PPP 
a
b
c

命令:

find .  -type f -maxdepth 1 -name '*PPP*' -printf '%T+ %p\n' | sort -r | head -1 | cut -d' ' -f2 | xargs head -1
a

当心文件名中的空格!

答案 1 :(得分:1)

在命令替换中将find-print0xargs -0一起使用

您的最佳解决方案尽管仍需要4个子shell,但通过使find输出可以与{{1}结合使用的以 nul终止的文件名,可以防止文件名中的所有警告。 }形成一个以nol结尾的文件名列表,该文件名将传递给xargs -0,以反向排序使用ls选择最后一个文件,并使用tail -n1选择该文件的第一行。

使用head -n1选项进行查找将搜索限制在当前目录,并防止递归到子目录(如果要搜索当前目录下的整个目录树,请将其删除),例如

-maxdepth 1

除了使用以nul结尾的文件名外,它还受益于让head -n1 $(find . -maxdepth 1 -type f -name "*PPP*" -print0 | xargs -0 ls -rt | tail -n 1) 构成列表进行排序,而不是循环查找最新文件名。

答案 2 :(得分:0)

temp = `ls -Art | head -n 1 `
head -1 $temp 

答案 3 :(得分:0)

head -n 1 $(find ./ -name "*PPP*" -type f | xargs ls -rt1 | tail -n 1)

上面命令的缺点是目录中必须有一个*PPP*文件,否则该命令将产生错误的结果。

答案 4 :(得分:0)

您也可以尝试以下方法:

ls -tr | grep "PPP" | tail -n 1 | xargs head -n 1