쉘 스크립트에서 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
보다 위해 (그러나 다른) 명령을 추가했습니다 .find
stat
대부분의 다른 stat
구현은 어떤 형식으로든 수정 시간을 제공할 수 있지만 GNU는 그럴 수 없습니다(그래서 귀하가 질문에서 GNU와의 조합에 의존하게 된 것 같습니다 stat
). 그러나 GNU는 가능합니다(GNU를 사용하면 그것도 사용할 수 있습니다).ls
date
find
date
date -r "$file" +%u
위는 %T<format-letter>
지정된 형식을 사용한 수정 시간입니다 strftime
. %Tu
요일을 의미하며 1(월요일)부터 7까지의 숫자입니다. 이는 로캘 종속 %a
/를 사용하는 것보다 스크립트에서 더 좋습니다.%A
해당 숫자를 인쇄한 다음 줄 바꿈으로 파일 이름을 처리할 수 있도록 NUL로 구분된 파일 경로를 인쇄하고 파이프를 통해 sed
6으로 시작하는 레코드를 선택합니다 6
(및 6을 제거합니다). 그런 다음 NUL은 출력 시 개행 문자로 변환됩니다.
-z
2012년에 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