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 {} \;