Obter Lista de Diretórios e Registro de Data e Hora em um formato específico no HP-UX

4

Estou no sistema operacional HP-UX B.11.11. Meu requisito é exibir apenas uma lista de diretórios e o último formato de hora modificado deve ser DD-MON-AAAA HH: MI: SS AM / PM . Eu posso pegar a lista usando

    ls -lF | grep /

OR

    ls -ld -- */

mas não consigo definir o formato da hora como quero. O parâmetro - full-time ou - time-style não funciona no HP-UX, e o HP-UX não tem status também.

Perguntas:

  1. Requisito principal: Alguém poderia me fornecer um script para exibir a lista de todos os nomes de diretório (não arquivos) no diretório atual e o último registro de data e hora modificado no formato mencionado acima? Não preciso do nome do proprietário, nome do grupo, tamanho, permissões, etc.

  2. Existe alguma outra maneira de exibir essas informações sem usar C ou Perl, usando apenas comandos e parâmetros padrão?

  3. Eu queria saber como o WinSCP é capaz de exibir o formato completo de data / hora na interface do usuário? Alguém sabe qual comando ele usa internamente para exibir o conteúdo do diretório na interface do usuário?

Qualquer ajuda é apreciada. Obrigado.

UPDATE (edições abaixo apenas):
Então, a resposta de Stéphane Chazelas com o script perl funcionou perfeitamente. Agora, estou tentando convertê-lo em um shell script, mas estou recebendo erros ao executá-lo. Salvei o script de shell dir_list.sh em /dev/scripts/ . Você poderia, por favor, ajudar onde eu estou errado?

#!/usr/bin/sh
# dir_list.sh : Generate a comma separated directory list with last modified timestamp
# Navigate to the directory where listing is required
cd /dev/product/jobs
# Execute Perl script
/usr/bin/perl -MPOSIX -MFcntl -MFile::stat -le '
  setlocale(LC_TIME, "C");
  for (<*>) {
    $s = lstat $_ or die "$_: $!\n";
    print "$_," . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime))
      if S_ISDIR($s->mode)
  }'
exit 0

MENSAGEM DE ERRO
Observe que tentei #!/usr/bin/sh também, mas ele falhou com a mesma mensagem de erro: interpreter "/usr/bin/sh" not found

$ ./dir_list.sh
interpreter "/bin/sh" not found
file link resolves to "/usr/bin/sh"
ksh: ./dir_list.sh:  not found

Atualização final: RESOLVIDO - Solução abaixo

Eu criei um script de shell Unix dir_list.sh que, quando chamado ( $ ./dir_list.sh ), pesquisa na pasta de destino especificada no script e exibe os nomes das pastas junto com o registro de data e hora associado como registros separados por vírgulas

#! /usr/bin/ksh
# dir_list.sh : Generate a comma separated directory list with last modified timestamp
#
# Navigate to the Target Directory
cd /dev/product/jobs || exit
#
# Execute Perl script to format the output
/usr/bin/perl -MPOSIX -MFcntl -MFile::stat -le '
  setlocale(LC_TIME, "C");
  for (<*>) {
    $s = lstat $_ or die "$_: $!\n";
    print "$_," . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime))
      if S_ISDIR($s->mode)
  }'
#
exit 0

Obrigado ao Stéphane Chazelas por toda sua ajuda! :)

    
por NiCKz 14.06.2018 / 12:25

2 respostas

3

A menos que os utilitários GNU estejam instalados, sua melhor aposta é provavelmente perl nesses sistemas tradicionais:

perl -MPOSIX -MFcntl -MFile::stat -le '
  setlocale(LC_TIME, "C");
  for (<*>) {
    $s = lstat $_ or die "$_: $!\n";
    print "$_ " . uc(strftime("%d-%b-%Y %I:%M:%S %p", localtime $s->mtime))
      if S_ISDIR($s->mode)
  }'

Essa é a interface perl para a chamada do sistema POSIX lstat() padrão que recupera os metadados do arquivo e a função strftime() para formatar as datas.

Consulte perldoc POSIX , perldoc -f lstat , perldoc -f stat , man lstat , man strftime para detalhes. Usamos a localidade C para LC_TIME , por isso, obtemos os nomes dos meses em inglês e PM / AM , independentemente das preferências do usuário.

Se zsh estiver instalado:

zsh -c 'zmodload zsh/stat
        LC_ALL=C stat -nA times -LF "%d-%b-%Y %I:%M:%S %p" +mtime -- *(/) &&
          for f t ($times) printf "%s\n" "$f: ${(U)t}"'

Acima, estamos usando perl ' uc() e zsh ' ${(U)var} para converter os registros de data e hora em maiúsculas. Nos sistemas GNU, você poderia ter usado %^b para uma abreviação de mês com letras maiúsculas, mas não parece estar disponível em HP / UX.

    
por 14.06.2018 / 13:05
0

encontrar. -tipo d -exec stat {} \; é a maneira usual do Unix System V. Parece que stat se torna fstat no HP-UX, então o comando se torna encontrar. -tipo d -exec fstat {} \;

Dependendo de seus requisitos, você pode ter que enviar a saída em awk (ou nawk ou gawk) para obter exatamente o que espera.

Ref: link

    
por 14.06.2018 / 18:31