Crie o diretório nomeado a partir do tempo de modificação do arquivo

3

Eu quero criar o nome do diretório a partir da hora da modificação de um arquivo. Por exemplo, se a hora de criação ou modificação do arquivo for 03/17/2016 18:00:00, eu quero criar um diretório chamado 1703206 . Estou usando o HP-UX.

    
por Chirag Dhaduk 20.03.2016 / 11:10

2 respostas

1

No Linux, se foo for seu arquivo

stat -c %Z foo

será o segundo desde a época (consulte man stat , você pode usar %W , %X , %Y , %Z para tempo de criação, tempo de acesso, hora da modificação, hora da alteração)

date --date=@$(stat -c %Z foo) +%m%d%y

dará o seu formato.

SO

 mkdir bar/prefix$(date --date=@$(stat -c %Z foo) +%m%d%y)suffix
  • substitua foo , bar , prefix e suffix pelo nome do arquivo real / desejado.
  • use quote arround var para evitar chars engraçados.
por 20.03.2016 / 11:26
1

Com apenas ferramentas POSIX (e o HP-UX não tem muito mais do que isso), isso é difícil, porque não há uma maneira conveniente de obter o tempo de modificação de um arquivo. Com ls -l , você precisa lidar com dois casos: arquivos recentes com mês, dia, casa e minuto e arquivos antigos (> 6 meses) com mês, dia e ano. (Pode haver uma maneira mais fácil de criar configurações de localidade apropriadas, mas não sei se isso pode ser feito no HP-UX.)

#!/bin/sh
set -e -f
set -- $(LC_ALL=C ls -dlog -- "$1")
# $1=permissions $2=link_count $3=size $4,$5,$6=date_time $7...=filename
case $4 in
  Jan) month=1;;
  Feb) month=2;;
  Mar) month=3;;
  Apr) month=4;;
  May) month=5;;
  Jun) month=6;;
  Jul) month=7;;
  Aug) month=8;;
  Sep) month=9;;
  Oct) month=10;;
  Nov) month=11;;
  Dec) month=12;;
esac
case $6 in
  *:*) # The timestamp is within the last 6 month, so
       # the year is the current or previous year.
    current_month=$(LC_ALL=C date +%Y%m)
    year=${current_month%??}
    current_month=${current_month#????}
    case $current_month in 0*) current_month=${current_month#0};; esac
    if [ $current_month -lt $month ]; then year=$((year-1)); fi;;
  *) year=$6;;
esac
if [ $month -le 9 ]; then month=0$month; fi
day=$5
if [ $day -le 9 ]; then day=0$day; fi
mkdir $year$month$day

Se você estiver usando uma versão antiga do HP-UX em que /bin/sh é um shell Bourne antigo, talvez seja necessário substituir /bin/sh na linha shebang pelo caminho para um shell POSIX, como ksh.

    
por 20.03.2016 / 17:14