Linux 如何将文件名前置到Unix中通过find命令找到的最后一行文件

Linux 如何将文件名前置到Unix中通过find命令找到的最后一行文件,linux,bash,unix,awk,find,Linux,Bash,Unix,Awk,Find,我有一个要求,我需要以以下格式显示目录下所有文件的最后一行 filename: lastline 我找到了下面的代码 find /user/directory/* -name "*txt" -mtime 0 -type f -exec awk '{s=$0};END{print FILENAME, ": ",s}' {} \; 但我每次都会读整个文件。我的目录中的文件很大,所以我负担不起。我有别的选择吗 find /user/directory/* -name "*txt" -mtime

我有一个要求,我需要以以下格式显示目录下所有文件的最后一行

filename: lastline
我找到了下面的代码

find /user/directory/* -name "*txt" -mtime 0   -type f -exec awk '{s=$0};END{print FILENAME, ": ",s}' {} \;
但我每次都会读整个文件。我的目录中的文件很大,所以我负担不起。我有别的选择吗

find /user/directory/* -name "*txt" -mtime 0 -type f | while IFS= read -r file
do
    echo -n "$file: "
    tail -1 "$file"
done

重要的变化是tail-1不会读取整个文件,而是从末尾读取一小部分,并增加它们,直到找到完整的最后一行。

如果您知道目录名:

for f in $(/bin/ls directory/*.txt); do 
    echo "$f: $(tail -1 $f)"
done
我会成功的。更一般地说

for f in $(find /user/directory -type f -name "*.txt"); do
    echo "$f: $(tail -1 $f)"
done 
这也行。程序tail将从末尾开始读取文件,tail-n将只读取指定文件的最后n行。

在其他答案中使用tail是好的。现在,您可以将所有这些内容包装到find命令中

如果您的查找支持-printf命令:

如果您的查找不支持-printf命令:


或者,避免echo中的元字符,如果您需要在Shell之间切换,则可能会出现问题。echo$file:$tail-1$file。请始终使用while IFS=read-r file,除非您有特定目的并完全理解这些注意事项。非常感谢!这样更好,我在答案中对其进行了更改。在directory/*.txt或find/user/directory-type f-name*.txt中使用f,而IFS=read-rf代替上述命令,这些命令对于包含空格的文件名将失败。如果文件名可以包含换行符,请查看xargs-0解决方案。
find /user/directory/ -name "*txt" -mtime 0 -type f -printf '%p: ' -exec tail -1 {} \;
find /user/directory/ -name "*txt" -mtime 0 -type f -exec printf '%s: ' {} \; -exec tail -1 {} \;