usando data em um shell script

0

Eu tenho um problema com o uso do comando date em um shell script; este é o meu script:

#!/bin/bash

for i in $(find . -type f -mtime +10 ); 
do
    echo "$i"
    echo "ligne dans la boucle";
    #il faut verifier si il a ete créer un samedi ou pas;
    jour='ls -lrt $i| awk '{print $7}'';
    mois='ls -lrt $i| awk '{print $6}'';
    annee='ls -lrt $i| awk '{print $8}'';
    requette="date -d '$mois $jour $annee' +'%a %u %A'";
    echo $requette;
    test=$($requette);
    echo $test;
    echo " ";
done

Então a saída é assim:

date: extra operand ‘2015'’

mas quando eu uso o comando diretamente no shell ele funciona: /

requette="date -d 'Feb 28 2015' +'%a %u %A'"

Se alguém puder me ajudar, seria ótimo!

    
por Kingofkech 01.03.2017 / 11:17

2 respostas

3

Se você quiser encontrar arquivos regulares que tenham mais de 10 dias e que tenham sido modificados pela última vez em um sábado (no fuso horário do usuário que está executando o script), com ferramentas GNU (e você parece estar em um GNU sistema como você está usando uma opção específica do GNU para date e o shell GNU), você pode fazer:

find . -type f -mtime +10 -printf '%Tu%p
find . -type f -mtime +10 -printf '%Tu%p
 while IFS=/ read -d '' -ru3 day file; do
   case $day in
     (6) printf '"%s" was last modified on a Saturday\n' "$file";;
   esac
 done 3< <(find . -type f -mtime +10 -printf '%Tu/%p
zmodload zsh/stat # for zsh's stat builtin
last_modified_on_a_saturday() {
  local -A stat
  stat -LF %u -H stat -- ${1-$REPLY} &&
    ((stat[mtime] == 6))
}
for file in **/*(ND.m+10+last_modified_on_a_saturday); do
   do-something with $file
done
')
' | tr '
find . -type f -mtime +10 -printf '%Tu%p
find . -type f -mtime +10 -printf '%Tu%p
 while IFS=/ read -d '' -ru3 day file; do
   case $day in
     (6) printf '"%s" was last modified on a Saturday\n' "$file";;
   esac
 done 3< <(find . -type f -mtime +10 -printf '%Tu/%p
zmodload zsh/stat # for zsh's stat builtin
last_modified_on_a_saturday() {
  local -A stat
  stat -LF %u -H stat -- ${1-$REPLY} &&
    ((stat[mtime] == 6))
}
for file in **/*(ND.m+10+last_modified_on_a_saturday); do
   do-something with $file
done
')
' | tr '%pre%\n' '\n%pre%' sed -n 's/^6//p' | tr '%pre%' '\n'
' | sed -zn 's/^6//p' | tr '%pre%' '\n'
\n' '\n%pre%' sed -n 's/^6//p' | tr '%pre%' '\n'
' | sed -zn 's/^6//p' | tr '%pre%' '\n'

Embora o GNU tenha adicionado (ainda que diferente) o comando stat no início dos anos 2000 para consultar metadados de arquivo de uma maneira mais scriptável, com ls , a maior parte de sua funcionalidade já estava no GNU find com uma interface muito melhor do que o GNU stat .

A maioria das outras implementações de stat pode dar a você o tempo de modificação em qualquer formato, GNU stat não (o motivo pelo qual você acaba recorrendo a uma combinação de ls e GNU date em sua pergunta I suponha que) mas GNU find pode (com GNU date , você também pode usar date -r "$file" +%u ).

Acima de %T<format-letter> é a hora da modificação usando o formato strftime especificado. %Tu é o dia da semana como um número de 1 (segunda-feira) a 7. Isso é melhor em scripts do que usar %a / %A que são dependentes de localidade.

Estamos imprimindo esse número seguido pelo caminho do arquivo, delimitado por NUL para poder manipular nomes de arquivo com caracteres de nova linha e canalizando para sed para selecionar os registros que começam com 6 (e remover esses 6 para eles). Os NULs são então traduzidos para nova linha na saída.

-z foi adicionado ao GNU sed em 2012. Se o sed for mais antigo, você pode alterar o acima para:

%pre%

Geralmente, você não deseja repetir a saída de find como na sua pergunta . Se você quisesse fazer um loop pelos arquivos encontrados por find em bash , preferiria fazer:

%pre%

Em zsh , você também pode fazer:

%pre%     
por 01.03.2017 / 12:19
3

Você pode simplificar consideravelmente o assunto usando o comando stat no lugar de ls .

#!/bin/bash
for i in $(find . -type f -mtime +10 ); 
do
   echo "$i"
   echo "ligne dans la boucle";
   #il faut verifier si il a ete créer un samedi ou pas;

   #///////////////////////
   #jour='ls -lrt $i| awk '{print $7}'';
   #mois='ls -lrt $i| awk '{print $6}'';
   #annee='ls -lrt $i| awk '{print $8}'';
   #requette="date -d '$mois $jour $annee' +'%a %u %A'";
   #//////////////////////////////

   # get the month, year, and day from stat-ing the file
   mois_jour_annee='stat -c '%y' "$i" | cut -d' ' -f1'

   # and then...
   requette="date -d '${mois_jour_annee}' +'%a %u %A'";

   echo "$requette";
   test=$(eval "$requette");
   echo "$test";
   echo " ";
done
    
por 01.03.2017 / 11:50