Localizando arquivos baseados em data, sem usar 'find'

1

Eu sei que find pode fazer o que estou procurando, mas estou querendo saber se existe uma maneira alternativa de encontrar arquivos no sistema de arquivos criados antes / depois de um determinado ponto ou em um determinado momento.

Geralmente, confio em updatedb & locate para a maioria das minhas necessidades de pesquisa de arquivos. Problemas com essas ferramentas, porém, são que ela só tem nomes de diretórios e arquivos, e apenas cria um banco de dados de diretórios locais, nada montado via CIFS | NFS ou via -o loop (por exemplo, imagens .iso).

Portanto, se eu precisar encontrar arquivos criados depois de ontem em todo o sistema (sistemas de arquivos locais e remotos), estou precisando usar find .

Que outras ferramentas, se as houver, conseguiriam de forma semelhante?

Eu tentei ls e grep , mas isso requer (em minhas tentativas até agora) várias pesquisas:

ls -lR | grep Aug | grep 10
ls -lR | grep Aug | grep 11
    
por warren 11.08.2011 / 16:55

6 respostas

1

Você pode personalizar a saída de timestamp de ls para ser mais facilmente compreensível:

ls -ln --time-style="+%Y%m%d%H%M%N"

e, em seguida, comparar datas é tão fácil de comparar strings. Você teria que fazer isso com o awk:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | awk -F " " '$6 > "201108100000000000000" {$1=$2=$3=$4=$5=$6=""; print substr($0, 7)}'

Tenha o cuidado de usar a opção correta -a ou -c no momento certo do arquivo.

E lembre-se que ctime não é hora de criação, é a hora da mudança de inode (criação, permissão, mudança de tamanho de arquivo, ...).

Editar :

o awk pode até ser evitado:

ls -ln --time-style="+%Y%m%d%H%M%N" | tail -n +2 | \
while read perms inode user group size date file; do
  if [ $date > "201108100000000000000" ]; then
    printf "%s\n" "$file"
  fi
done
    
por 11.08.2011 / 19:47
1

você pode usar alternativas com egrep:

ls -lR | egrep "Aug *10|Aug *11"
    
por 11.08.2011 / 17:07
1

para um único comando rápido para digitar, não tenho certeza, você pode estar melhor com um script fazendo uma linha complicada ou múltipla. Existe essa linha, que usa uma regex
$ls -lR | grep -E "2011-08-1[01]"
Um regex como a [bc] significa a seguido por b ou c. Então, 1 [01] cobre 10 e 11. Você poderia fazer 1 [0-3] por 10-13, embora não estejamos na data de 13º ainda quando escrevemos. Isso seria 07 ou 08 ou 09 ou 10 ou 11 ... 13. 0 [7-9] | 1 [0123].

    
por 11.08.2011 / 17:23
1

Eu gostaria de perguntar por que você não quer usar o find , mas eu não acho que eu realmente queira saber ...

Eu tentaria com o awk:

ls -lR | awk '{ d="^2011-0[78]"; if ($6 ~ d){ print $0 }}'

d no comando é uma expressão regular.
Em seguida, a sexta coluna da saída ls é avaliada com a regex fornecida e a linha inteira impressa somente se existir.
No meu sistema data está no formato de aaaa-mm-dd hh: mi e com regex eu estava procurando por arquivos Jul e Aug. Altere a regex de acordo com suas necessidades.

Também para adicionar porque eu escolhi o awk : você pode substituir print $ 0 com print $ 8 e você só pega o nome do arquivo na saída - com grep regex seria uma bagunça ...

    
por 11.08.2011 / 17:17
1

Você pode usar a compilação -nt e -ot nos testes bash. Do manual bash:

file1 -nt file2: True if file1 is newer (according to modification date) than file2, or if file1 exists and file2 does not.

file1 -ot file2: True if file1 is older than file2, or if file2 exists and file1 does not.

Para criar um arquivo temporário de teste, você pode usar o toque.

Para percorrer os arquivos em um diretório, você pode usar a expansão de shell e o bash build nos testes bash para o teste de diretório ( -d file ). Mas tenha cuidado com loops de links no sistema de arquivos.

    
por 11.08.2011 / 19:19
1

Você pode criar um arquivo temporário com o registro de data e hora de sua pesquisa e, em seguida, usar a opção de classificação de ls: os arquivos que você está procurando seriam antes (ou depois) do arquivo temporário.

A divisão de arquivos (ou divisão de saídas ls) é discutida em divisão de arquivos do Linux .

    
por 11.08.2011 / 19:28