【问题标题】:sort results given by find command对 find 命令给出的结果进行排序
【发布时间】:2014-04-10 21:45:29
【问题描述】:

这是查找命令:

find . -name 'VPN_CALLRECORD_20140409*' -type f| xargs ls -lhrt |awk '{print $9}' > log.txt

这是我要查找的文件集,这些文件可能是 7000 个被定向到“xargs”的文件,我只是列出了第一部分、中间部分和最后一部分

-rw-rw-r-- 1 see  seegrp  100K Feb 12 00:00 VPN_CALLRECORD_20140409000000_000760000.txt
-rw-rw-r-- 1 see  seegrp  193K Feb 12 00:01 VPN_CALLRECORD_20140409000000_000760001.txt
.
.
-rw-rw-r-- 1 see  seegrp  193K Feb 12 10:03 VPN_CALLRECORD_20140409174500_000764500.txt
.
.
-rw-rw-r-- 1 see  seegrp   95K Feb 12 23:59 VPN_CALLRECORD_20140409235500_000766488.txt
-rw-rw-r-- 1 see  seegrp  103K Feb 12 23:59 VPN_CALLRECORD_20140409235500_000766489.txt

稍后这是用于压缩的 tar:

tar -czf cdr_backup.tar.gz -T log.txt

使用这种方式做日志时会出现问题,因为 log.txt 文件上的结果没有正确排序,我认为这是由于某些 xargs 限制

代码:

number=$(more log.txt |wc -l)
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++">>log_after_cdr_backup.txt
echo "Start Time : $DATETIME">>log_after_cdr_backup.txt
echo "Tar file created: $FILE">>log_after_cdr_backup.txt
echo "Tar file contains $number CDRs backed up successfully">>log_after_cdr_backup.txt
firstline=$(head -n 1 log.txt)
echo "from this sequence $firstline ">>log_after_cdr_backup.txt
lastline=$(tail -1 log.txt)
echo "to this one $lastline">>log_after_cdr_backup.txt
echo "Finish Time : $FINISHTIME">>log_after_cdr_backup.txt
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++">>log_after_cdr_backup.txt

生成的输出:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Start Time : 20140410 15:16:24
Tar file created: cdr_backup.tar.gz
Tar file contains 7720 CDRs backed up successfully
from this sequence ./VPN_CALLRECORD_20140409000000_000741343.txt
to this one ./VPN_CALLRECORD_20140409174500_000764500.txt
Finish Time : 20140410 15:23:42
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

请注意,最后一个序列不是应该的

VPN_CALLRECORD_20140409235500_000766489.txt

为什么?我不确定,我试图在 log.txt 文件中对结果进行排序,所以这个

lastline=$(tail -1 ${TEMPFILE})

可以工作,但不能,你知道为什么吗?

【问题讨论】:

    标签: linux shell find ls xargs


    【解决方案1】:

    Xargs 将拆分传入参数的数量以避免创建太长的命令行。此外,“find”的输出不会以任何方式排序。如果要排序,请在管道中插入对“排序”的调用(例如,在末尾)。

    【讨论】:

    • sort 不能使用,因为可能同时创建了很多文件,即上面最后两个文件是在 23:59 创建的,那么如何对这些文件进行排序?我的意思是使用时间列作为标准
    • @Patricio_Estrella 类似sort < <(find -printf "%T@ %p\n")虽然我不确定在这种情况下你是否会遇到缓冲问题。可能需要将输出转移到文件然后排序。
    • 您希望如何对文件进行排序?您必须能够实际定义排序顺序。当您说“正确排序”时,“正确”的定义是什么?
    • 嗨,我想按日期排序,根据您的输入,我做了这个prFEP1a:/home/see/rbirun/send/VPN/Mobile # more script_for_log.sh #!/bin/sh firstline=$(find . -name 'VPN_CALLRECORD_20140410*' -type f -printf '%T@ %p\n' | sort -k1 -n |head -n 1|awk '{print $2}') lastline=$(find . -name 'VPN_CALLRECORD_20140410*' -type f -printf '%T@ %p\n' | sort -k1 -n |tail -1|awk '{print $2}') echo $firstline echo $lastline prFEP1a:/home/see/rbirun/send/VPN/Mobile # sh script_for_log.sh ./VPN_CALLRECORD_20140410000000_000766490.txt ./VPN_CALLRECORD_20140410235500_000775310.txt
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    相关资源
    最近更新 更多