쉘 스크립트에서 날짜 사용

쉘 스크립트에서 날짜 사용

쉘 스크립트에서 date 명령을 사용하는 데 문제가 있습니다. 제 스크립트는 다음과 같습니다.

#!/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

따라서 출력은 다음과 같습니다.

date: extra operand ‘2015'’

하지만 쉘에서 직접 명령을 사용하면 작동합니다./

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

누군가가 나를 도울 수 있다면 좋을 것입니다!

답변1

GNU 도구를 사용하여 10일이 넘고 토요일(스크립트를 실행하는 사용자의 시간대)에 마지막으로 수정된 일반 파일을 찾으려는 경우(그리고 GNU 특정 옵션 date과 GNU 쉘) 다음을 수행할 수 있습니다.

find . -type f -mtime +10 -printf '%Tu%p\0' |
  sed -zn 's/^6//p' |
  tr '\0' '\n'

GNU는 결국 2000년대 초반에 GNU stat더 스크립트 가능한 방식으로 파일 메타데이터를ls보다 위해 (그러나 다른) 명령을 추가했습니다 .findstat

대부분의 다른 stat구현은 어떤 형식으로든 수정 시간을 제공할 수 있지만 GNU는 그럴 수 없습니다(그래서 귀하가 질문에서 GNU와의 조합에 의존하게 된 것 같습니다 stat). 그러나 GNU는 가능합니다(GNU를 사용하면 그것도 사용할 수 있습니다).lsdatefinddatedate -r "$file" +%u

위는 %T<format-letter>지정된 형식을 사용한 수정 시간입니다 strftime. %Tu요일을 의미하며 1(월요일)부터 7까지의 숫자입니다. 이는 로캘 종속 %a/를 사용하는 것보다 스크립트에서 더 좋습니다.%A

해당 숫자를 인쇄한 다음 줄 바꿈으로 파일 이름을 처리할 수 있도록 NUL로 구분된 파일 경로를 인쇄하고 파이프를 통해 sed6으로 시작하는 레코드를 선택합니다 6(및 6을 제거합니다). 그런 다음 NUL은 출력 시 개행 문자로 변환됩니다.

-z2012년에 GNU에 추가되었습니다 sed. 나이 가 많은 경우 sed위의 내용을 다음과 같이 변경할 수 있습니다.

find . -type f -mtime +10 -printf '%Tu%p\0' |
  tr '\0\n' '\n\0'
  sed -n 's/^6//p' |
  tr '\0' '\n'

일반적으로 말하면,find질문처럼 출력을 반복하고 싶지 않습니다.. find찾은 파일을 반복하려면 bash다음을 수행하는 것이 좋습니다.

 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\0')

에서는 zsh다음 작업도 수행할 수 있습니다.

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

답변2

stat명령 대체를 사용하면 문제가 크게 단순화될 수 있습니다 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

관련 정보