O comando Find retorna arquivos errados

4

Estou tentando encontrar arquivos em uma pasta usando o comando find, que é um dia mais antigo que o dia em que o comando é executado. Eu uso o seguinte comando:

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

Mas a saída parece ser assim:

-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

Deve ter sido

-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

E a hora atual Sex Mar 21 16:10:42 UTC 2014. Por que isso está acontecendo? Os arquivos são armazenados em uma unidade de compartilhamento de samba.

    
por Jishnu U Nair 21.03.2014 / 17:14

2 respostas

2

A sintaxe que você está usando encontrará arquivos com mais de 24 horas. Para o seu tempo atual de Fri Mar 21 16:10:42 UTC 2014 , isso seria arquivos modificados antes de Fri Mar 20 16:10:42 UTC 2014 . No entanto, a partir da sua pergunta, parece que você deseja que os arquivos sejam modificados antes de Fri Mar 21 00:00:00 UTC 2014 .

A maneira de fazer isso é criar um arquivo temporário e alterar o horário de modificação para a meia-noite daquele dia (basta especificar apenas a data). O comando find pode então comparar com esse arquivo. Isso funcionará no 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"

Note que +%F não é POSIX, aqui você teria que usar +%Y-%m-%d (também mktemp não é POSIX, mas pode ser encontrado na maioria dos sistemas Unix-like). Observe também as diferenças no formato de hora da saída que você publicou. No primeiro, o nome do arquivo é campo 9, no segundo campo 8. Isso irá variar dependendo de como as variáveis de ambiente relacionadas ao código de idioma estão definidas. Eu contornei isso fazendo awk imprimir o último campo em vez de um número de campo específico. Isso funcionará enquanto não houver espaços, etc. nos nomes de arquivos.

Atualizar

Na verdade, olhando mais atentamente para o resultado esperado x esperado, parece que o que aconteceu é que houve tantos arquivos que xargs fez mais de uma execução de ls . Isso impediria que os arquivos fossem classificados corretamente. Como os arquivos são datados, a coisa mais simples a fazer é canalizar para sort em vez de usar 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"
    
por 22.03.2014 / 11:41
5

O comando find exibirá os resultados desejados se todas as condições forem verdadeiras. Caso contrário, a saída será inesperada, fazendo parecer que não está funcionando.

Para find dos arquivos com exatamente 24 horas, é necessário -mtime 1 . No entanto, se não houver arquivos que atendam a essa condição, ls -lt listará todos os arquivos no caminho find .

Da mesma forma, se você pesquisar -name "*nopcap" , mas não houver arquivos que terminem com nopcap , todos os arquivos no caminho find serão exibidos.

De acordo com a página find man:

  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.
    
por 21.03.2014 / 18:14

Tags