
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
( 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"