찾기 명령이 잘못된 파일을 반환함

찾기 명령이 잘못된 파일을 반환함

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

현재 시간은 2014년 3월 21일 금요일 16:10:42 UTC입니다. 왜 이런 일이 발생합니까? 이 파일은 Samba 공유 드라이브에 저장됩니다.

답변1

find모든 조건이 true이면 명령이 원하는 결과를 표시합니다. 그렇지 않으면 예상치 못한 출력이 발생하여 작동하지 않는 것처럼 보입니다.

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( mktempPOSIX도 아니지만 대부분의 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"

관련 정보