我正在研究需要从目录下最新文件中读取第一行的要求。在目录中,我可以有多个文件,但是我想从文件名中包含PPP的所有文件中读取最新文件的第一行。
我知道如何读取文件的第一行并将其写入文件
head -n 1 jsonPPPvp.txt > output.txt
但是如何从目录中所有包含PPP的文件中选择最新文件(按照时间戳)?
请提出任何建议...!
我写了一条命令
答案 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
和-print0
和xargs -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