La command Find renvoie des files erronés

J'essaye de find des dossiers dans un dossier en utilisant la command de search qui sont un jour plus vieux que le jour où la command est exécutée. J'emploie la command suivante:

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

Mais la sortie semble être comme:

 -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 

Il aurait dû être

 -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 

Et l'heure actuelle ven Mar 21 16:10:42 UTC 2014. Pourquoi cela se passe-t-il? Les files sont stockés dans un lecteur de partage samba.

La syntaxe que vous utilisez finda des files de plus de 24 heures. Pour votre heure actuelle de Fri Mar 21 16:10:42 UTC 2014 , ce serait des files modifiés avant Fri Mar 20 16:10:42 UTC 2014 . Cependant, d'après votre question, il semble que vous souhaitiez que les files soient modifiés avant le Fri Mar 21 00:00:00 UTC 2014 .

La façon de le faire est de créer un file temporaire et de modifier l'heure de modification à minuit ce jour-là (il suffit de spécifier la date uniquement). La command find peut ensuite être comparée à ce file. Cela fonctionnera sous 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" 

Notez que le +%F n'est pas POSIX, ici vous devriez utiliser +%Y-%m-%d (aussi mktemp n'est pas POSIX, mais peut être trouvé sur la plupart des systèmes Unix). Notez également les différences dans le format de l'heure de la sortie que vous avez posté. Dans le premier, le nom de file est le champ 9, dans le deuxième champ 8. Cela dépend de la façon dont les variables d'environnement liées aux parameters régionaux sont définies. J'ai eu autour de ceci en faisant awk imprimer le dernier champ plutôt qu'un numéro de champ spécifique. Cela fonctionnera tant qu'il n'y a pas d'espaces etc dans les noms de files.

Mettre à jour

En regardant plus attentivement votre sortie attendue vs attendue, il ressemble plus à ce qui s'est passé, c'est qu'il y a eu tellement de files que xargs a fait plus d'une série de ls . Cela empêcherait les files d'être sortingés correctement. Puisque les files sont horodatés, la chose la plus simple à faire est de sort pour sort au lieu d'utiliser 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" 

La command find affichera les résultats souhaités si toutes ses conditions sont vraies. Si ce n'est pas le cas, la sortie sera inattendue, faisant apparaître qu'elle ne fonctionne pas.

Pour find les files qui ont exactement 24 heures, -mtime 1 est requirejs. Cependant, s'il n'y a pas de files répondant à cette condition, ls -lt tous les files dans le path de find .

De la même façon, si vous searchz -name "*nopcap" mais qu'aucun file ne se termine par nopcap , tous les files du path de find seront affichés.

Selon la page du manuel de 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.