Encontre arquivos criados após um determinado período em csh no SunOS

Encontre arquivos criados após um determinado período em csh no SunOS

No meu sistema SunOS, estou tentando encontrar todos os arquivos criados depois das 19h usando csh, lse awk.

ls -l  "${Source_files_Dir}"/*.zip| awk -v today="$(date "+%b %d")" '{
date=$6" "$7; time=$8; if (date == today && substr(time,1,2) >= 19)
print $9 }'|xargs -n 1 basename

Este comando funciona, kshmas não em csh. Como posso conseguir isso csh?

Nota: -newermta opção não é suportada no findSunOS, então tentei usar o lscomando acima.

Responder1

De qualquer forma, essa abordagem é bastante esquisita, seria melhor usar perl:

perl -MPOSIX -MFile::Basename -le '@start = localtime; @start[0..2] = (0,0,19); $start = mktime(@start); for (@ARGV) {print basename$_ if @s = stat$_ and $s[9] >= $start}' -- "$Source_files_Dir"/*.zip

Não sei por que você usaria csh neste século, mas observe que o procedimento acima não funciona corretamente cshse $Source_files_Dircontiver caracteres de nova linha. Substituir "$Source_files"por $Source_files:qseria melhor no csh (mas não funcionaria mais em outros shells).

Solaris (anteriormente conhecido como SunOS) também normalmente teria zshinstalado, onde é apenas uma questão de fazer:

autoload age
print -rC1 -- $Source_files_Dir/*.zip(Ne[age 19:00]:t)

Listando alguns dos problemas com sua abordagem:

  • ls -l "${Source_files_Dir}"/*.zip: se $Source_files_Dircomeçar com -, será tratado como uma opção por ls. Geralmente, você precisa --marcar o final das opções se o que segue for variável.
  • se algum dos arquivos zip for do tipo diretório, seu conteúdo será listado. Ao usar lscom um glob ou dados geralmente variáveis, você geralmente deseja usar a -dopção:ls -ld -- ...
  • Especificamente no csh, se $Source_files_Dircontiver caracteres de nova linha, isso causará um erro de sintaxe. $Source_files_Dir:qé melhor em csh conforme mencionado acima.
  • Em qualquer caso, você está assumindo que os caminhos dos arquivos (nomes de arquivos e destinos de links simbólicos que ls -ltambém relatam) não contêm caracteres de nova linha enquanto você processa a saída com lsbase em linhas.
  • Você está assumindo que a data/hora está nos campos 6, 7, 8, que serão desfeitos se os nomes de usuários ou grupos contiverem espaços em branco. Usar -nem vez de (ou além de) -lobter uid/gids numéricos o tornaria mais robusto (e evitaria a tradução potencialmente dispendiosa para nomes).
  • date +%dgera um número preenchido com 0, enquanto com muitas lsimplementações e em muitas localidades (e isso é um requisito POSIX na localidade C/POSIX), ls -lgera um número preenchido com espaço ( date +%e).
  • ls -lsaídas Mon dd HH:MMpara datas recentes, não no futuro, mas Mon dd YYYYpara outras que sua abordagem não suporta.
  • sem a -Lopção, para links simbólicos, será listado o horário de modificação do link simbólico, em oposição ao arquivo zip para o qual ele aponta. perl's stat()ou zsh' agefuncionam com o mtime do alvo.
  • com your {print $9}, além de nomes de usuários/grupos que não contêm espaços em branco, você está assumindo que os caminhos dos arquivos também não.
  • o uso xargsdessa saída bruta falhará se os caminhos dos arquivos contiverem barras invertidas ou aspas e, se não for executado no código do idioma C, em nomes de arquivos que não sejam codificados em texto na codificação do código do idioma.
  • se não houver nenhum arquivo zip não oculto no diretório, em csh, você receberá um No matcherro e lsnão será executado (o que pelo menos é melhor do que o comportamento no estilo Bourne, onde lsé chamado literalmente com o padrão), mas xargsainda será executado e basenameainda será executado uma vez sem nenhum argumento, provavelmente causando um erro confuso.

Responder2

Recebi resposta para csh, em vez de '$'usar backticksa data de hoje armazenada em uma variável, todayem vez de inseri-la awk.

set today=`date "+%b %d"`
ls -l "$Source_files_Dir"/*.zip | awk -v today="$today" ' \
{ \
    date=$6" "$7; \
    time=$8; \
    if (date == today && substr(time,1,2) >= 19) print $9; \
}'|xargs -n 1 basename

informação relacionada