查找命令返回错误的文件

查找命令返回错误的文件

我正在尝试使用 find 命令查找文件夹中的文件,这些文件比运行该命令的日期早一天。我使用以下命令:

FILES_dcn=($(find  $dir_dcn -maxdepth 1 -type f -name "*.pcap" -mtime +1 -print0 | xargs -0 ls -lt | tail -15 | awk '{print $9}'))

但输出似乎是这样的:

-rw-rw-rw- 1 nethawk nethawk  2097664 Mar 16 01:58 /mnt/md0/capture/dcn/dcn_2014_03_16_01_58_00_438.pcap
-rw-r--r-- 1 root    root    27935978 Mar 17 10:00 /mnt/md0/capture/dcn/dcn_2014_03_16_18_29_18_983.pcap
-rw-rw-rw- 1 nethawk nethawk  2097296 Mar 17 10:02 /mnt/md0/capture/dcn/dcn_2014_03_17_10_02_00_335.pcap
-rw-rw-rw- 1 nethawk nethawk  2097192 Mar 17 10:02 /mnt/md0/capture/dcn/dcn_2014_03_17_10_02_49_476.pcap
-rw-rw-rw- 1 nethawk nethawk  2097936 Mar 17 10:07 /mnt/md0/capture/dcn/dcn_2014_03_17_10_06_59_326.pcap
-rw-rw-rw- 1 nethawk nethawk  2097464 Mar 17 10:10 /mnt/md0/capture/dcn/dcn_2014_03_17_10_10_00_407.pcap
-rw-rw-rw- 1 nethawk nethawk  2097232 Mar 17 10:13 /mnt/md0/capture/dcn/dcn_2014_03_17_10_13_48_603.pcap
-rw-rw-rw- 1 nethawk nethawk   426800 Mar 17 10:14 /mnt/md0/capture/dcn/dcn_2014_03_17_10_13_58_428.pcap
-rw-rw-rw- 1 nethawk nethawk  2097544 Mar 17 10:14 /mnt/md0/capture/dcn/dcn_2014_03_17_10_14_10_259.pcap
-rw-rw-rw- 1 nethawk nethawk  2097600 Mar 17 10:14 /mnt/md0/capture/dcn/dcn_2014_03_17_10_14_49_609.pcap
-rw-rw-rw- 1 nethawk nethawk  2097472 Mar 17 10:17 /mnt/md0/capture/dcn/dcn_2014_03_17_10_16_59_503.pcap
-rw-rw-rw- 1 nethawk nethawk  2097696 Mar 17 10:17 /mnt/md0/capture/dcn/dcn_2014_03_17_10_17_48_698.pcap
-rw-rw-rw- 1 nethawk nethawk  2098048 Mar 17 10:18 /mnt/md0/capture/dcn/dcn_2014_03_17_10_18_29_981.pcap
-rw-rw-rw- 1 nethawk nethawk  2097352 Mar 17 10:20 /mnt/md0/capture/dcn/dcn_2014_03_17_10_20_10_320.pcap
-rw-rw-rw- 1 nethawk nethawk  2097416 Mar 17 10:20 /mnt/md0/capture/dcn/dcn_2014_03_17_10_20_49_703.pcap

它本来应该是

-rw-rw-rw- 1 nethawk nethawk  2097296 2014-03-17 10:02 dcn_2014_03_17_10_02_00_335.pcap
-rw-rw-rw- 1 nethawk nethawk   443736 2014-03-17 10:02 dcn_2014_03_17_10_01_58_254.pcap
-rw-rw-rw- 1 nethawk nethawk  2098136 2014-03-17 10:01 dcn_2014_03_17_10_01_48_427.pcap
-rw-rw-rw- 1 nethawk nethawk  2097456 2014-03-17 10:01 dcn_2014_03_17_10_01_38_622.pcap
-rw-rw-rw- 1 nethawk nethawk  2097480 2014-03-17 10:01 dcn_2014_03_17_10_01_28_773.pcap
-rw-rw-rw- 1 nethawk nethawk  2097184 2014-03-17 10:01 dcn_2014_03_17_10_01_18_966.pcap
-rw-rw-rw- 1 nethawk nethawk  2097184 2014-03-17 10:01 dcn_2014_03_17_10_01_09_127.pcap
-rw-rw-rw- 1 nethawk nethawk  2097272 2014-03-17 10:01 dcn_2014_03_17_10_00_59_280.pcap
-rw-rw-rw- 1 nethawk nethawk  2097896 2014-03-17 10:00 dcn_2014_03_17_10_00_49_462.pcap
-rw-rw-rw- 1 nethawk nethawk  2097376 2014-03-17 10:00 dcn_2014_03_17_10_00_39_653.pcap
-rw-rw-rw- 1 nethawk nethawk  2097344 2014-03-17 10:00 dcn_2014_03_17_10_00_29_816.pcap
-rw-rw-rw- 1 nethawk nethawk  2097656 2014-03-17 10:00 dcn_2014_03_17_10_00_19_977.pcap
-rw-rw-rw- 1 nethawk nethawk  2097232 2014-03-17 10:00 dcn_2014_03_17_10_00_10_172.pcap
-rw-rw-rw- 1 nethawk nethawk  2097656 2014-03-17 10:00 dcn_2014_03_17_10_00_00_323.pcap
-rw-rw-rw- 1 nethawk nethawk   435544 2014-03-17 10:00 dcn_2014_03_17_09_59_58_280.pcap

当前时间 UTC 2014 年 3 月 21 日星期五 16:10:42。为什么会发生这种情况?这些文件存储在 samba 共享驱动器中。

答案1

find如果所有条件都成立,该命令将显示所需的结果。如果没有,输出将是意外的,使其看起来不起作用。

需要find恰好 24 小时前的文件-mtime 1。但是,如果没有满足此条件的文件,ls -lt则会列出路径中的所有文件find

同样,如果搜索-name "*nopcap"但没有以 结尾的文件,则会显示nopcap该路径下的所有文件。find

根据find手册页:

  Numeric arguments can be specified as

  +n     for greater than n,

  -n     for less than n,

  n      for exactly n.

...

  -mtime n
            File’s  data was last modified n*24 hours ago.  See the comments for -atime 
            to understand how rounding affects the interpretation of file modification
            times.

答案2

您使用的语法将查找超过 24 小时的文件。对于您当前的时间Fri Mar 21 16:10:42 UTC 2014,这将是之前修改过的文件Fri Mar 20 16:10:42 UTC 2014。但是从您的问题来看,您似乎希望之前修改过文件Fri Mar 21 00:00:00 UTC 2014

方法是创建一个临时文件并将修改时间更改为当天午夜(只需指定日期即可)。然后该find命令可以与该文件进行比较。这将在 Linux 上运行:

time_file=$(mktemp)
touch -d "$(date +%F)" "$time_file"
find  $dir_dcn -maxdepth 1 -type f -name "*.pcap" ! -newer "$time_file" \
  -exec ls -lt {} + |
  tail -15 |
  awk '{print $(NF-1)}'
rm "$time_file"

注意,这+%F不是 POSIX,这里你必须使用+%Y-%m-%d(也不mktemp是 POSIX,但可以在大多数类 Unix 系统上找到)。另请注意您发布的输出的时间格式的差异。第一个文件名是字段 9,第二个字段是 8。这将根据与区域设置相关的环境变量的设置方式而有所不同。我通过awk打印最后一个字段而不是特定的字段编号来解决这个问题。只要文件名中没有空格等,这就可以工作。

更新

实际上,更仔细地查看您的预期输出和预期输出,看起来更像是发生了这样的情况:有太多文件已经xargs执行了不止一次ls.这将阻止文件正确排序。由于文件带有日期标记,因此最简单的方法是通过管道传输到sort而不是使用ls.

time_file=$(mktemp)
touch -d "$(date +%F)" "$time_file"
find  $dir_dcn -maxdepth 1 -type f -name "*.pcap" ! -newer "$time_file" |
  sort |
  tail -15
rm "$time_file"

相关内容