Eu tenho um arquivo nomeado com YYYYMMDD
no nome do arquivo, como
file-name-20151002.txt
Desejo determinar se este arquivo foi modificado após 02/10/2015.
Notas:
- Eu posso fazer isso olhando a saída de
ls
, mas sei que analisar a saída dels
é uma má idéia. - Não preciso encontrar todos os arquivos datados após uma data específica, só preciso testar um arquivo específico por vez.
- Não estou preocupado com o arquivo ser modificado na mesma data após a criação. Ou seja, eu só quero saber se este arquivo com
20151002
o nome foi modificado em 03 de outubro de 2015 ou posterior. - Estou no MacOs 10.9.5.
bash
files
osx
timestamps
Peter Grill
fonte
fonte
Respostas:
Aqui estão algumas maneiras possíveis com:
OSX stat
:GNU date
:zsh
só:Uso:
Exemplo de saída:
ou
fonte
O script a seguir verificará as datas de todos os arquivos especificados na linha de comando:
Ele requer versões GNU de
sed
,date
estat
Aqui está uma versão que não foi testada, mas deve funcionar em Macs (e no FreeBSD etc.) se eu li as páginas de manual on-line corretamente:
fonte
sed: illegal option -- r
com o MacOS 10.9.5.-r
é umased
opção GNU para dizer a ele para usar expressões regulares estendidas. Você pode alterar o script sed para usar regexp básico em vez de estendido (por exemplo,sed -e 's/^.*\(2015\)/\1/')
mas o restante do script provavelmente ainda falhará porque requer as versões GNU dedate
estat
, e eu não acho que os Macs os acompanhem como padrão (embora sejam disponível para Mac em pacotes pré-compilados)Usando bash e
stat
eexpr
obter as datas como números e compará-los:Esta foi minha resposta específica para Linux anterior.
O
=~
operador bash regexp captura os 8 dígitos do nome do arquivo no array bash BASH_REMATCH.[[ ]]
compara as strings, embora você simplesmente as compare como números em vez disso[ -gt ]
.fonte
-c
opçãostat
.stat -f %m -t %F "$file"
. Desculpe, não posso testá-lo.stat
seu comentário, as coisas parecem executar, mas não há saída para todos os casos de teste. Mas o que está"$file" =~ ([0-9]{8}).txt$
fazendo?.txt
no final do nome do arquivo. Os parênteses()
capturam a parte de 8 dígitos e você pode encontrá-la${BASH_REMATCH[1]}
.if [[=~]]
tente o básicoif filedate=$(expr "$file" : '.*-\([0-9]*\).txt')
e substitua-o${BASH_REMATCH[1]}
por$filedate
.Você poderia fazer isso:
touch
comando (adicionando 0s por hora / minuto / segundo) para definir a data de modificação do arquivo temporárioPorque sua pergunta é sobre
bash
, você provavelmente está usando Linux. Otest
programa usado no Linux (parte do coreutils ) possui extensões para comparação de timestamp (-nt
e-ot
) não encontradas no POSIXtest
.O POSIX comenta sobre isso na justificativa para
test
:Usando essa extensão, você pode então
-nt
operadortest
para fazer a comparação solicitada.Aqui está um exemplo. Um esclarecimento do OP mencionou a plataforma, para que se pudesse usar
stat
como alternativa aos arquivos temporários (compare OSX e Linux ):fonte
trap
comando.Outra
zsh
abordagem:Relataria os arquivos que possuem algo que parece um carimbo de data / hora em seu nome, mas que não corresponde ao horário da última modificação.
zsh
possui uma infinidade de operadores como esse para manipular globs e variáveis. É muito útil realizar qualquer trabalho rapidamente (e geralmente de maneira confiável), mas é muito difícil entender tudo isso e geralmente produz o que geralmente chamamos de código somente de gravação (eufemismo para código ilegível, mas também implica que você não você não precisa lê-lo enquanto o escreve para um único uso no prompt de comando)Uma rápida análise:
**/pattern(qualifier)
: glob recursivo com qualificador glob.[0-9](#c8)
corresponde a 8 dígitos. Esse é o equivalente do zsh extendedglob deksh
's{8}([0-9])
.D
: incluir arquivos ocultose@...@
: o qualificador eval glob para executar algum texto para qualificar ainda mais os arquivos. Caminho do arquivo passado$REPLY
zstat...
recupere o mtime formatado como AAAAMMDD na$m
matriz.${REPLY:t}
: expande para a cauda t (o nome da base) do arquivo.${(SM)something#pattern}
. Extraia o padrão de correspondência de peças de algo . AquelesS
( S pesquisa ubstring) eM
(expandir para M atched parte) são chamados de bandeiras de expansão parâmetro .fonte