![Encontre arquivos criados após um determinado período em csh no SunOS](https://rvso.com/image/231043/Encontre%20arquivos%20criados%20ap%C3%B3s%20um%20determinado%20per%C3%ADodo%20em%20csh%20no%20SunOS.png)
No meu sistema SunOS, estou tentando encontrar todos os arquivos criados depois das 19h usando csh
, ls
e 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, ksh
mas não em csh
. Como posso conseguir isso csh
?
Nota: -newermt
a opção não é suportada no find
SunOS, então tentei usar o ls
comando 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 csh
se $Source_files_Dir
contiver caracteres de nova linha. Substituir "$Source_files"
por $Source_files:q
seria melhor no csh (mas não funcionaria mais em outros shells).
Solaris (anteriormente conhecido como SunOS) também normalmente teria zsh
instalado, 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_Dir
começar com-
, será tratado como uma opção porls
. 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
ls
com um glob ou dados geralmente variáveis, você geralmente deseja usar a-d
opção:ls -ld -- ...
- Especificamente no csh, se
$Source_files_Dir
contiver 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 -l
também relatam) não contêm caracteres de nova linha enquanto você processa a saída comls
base 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
-n
em vez de (ou além de)-l
obter uid/gids numéricos o tornaria mais robusto (e evitaria a tradução potencialmente dispendiosa para nomes). date +%d
gera um número preenchido com 0, enquanto com muitasls
implementações e em muitas localidades (e isso é um requisito POSIX na localidade C/POSIX),ls -l
gera um número preenchido com espaço (date +%e
).ls -l
saídasMon dd HH:MM
para datas recentes, não no futuro, masMon dd YYYY
para outras que sua abordagem não suporta.- sem a
-L
opçã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
'sstat()
ouzsh
'age
funcionam 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
xargs
dessa 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 match
erro els
não será executado (o que pelo menos é melhor do que o comportamento no estilo Bourne, ondels
é chamado literalmente com o padrão), masxargs
ainda será executado ebasename
ainda será executado uma vez sem nenhum argumento, provavelmente causando um erro confuso.
Responder2
Recebi resposta para csh, em vez de '$'
usar backticks
a data de hoje armazenada em uma variável, today
em 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