30분보다 오래된 디렉터리에 특정 파일이 있는지 확인하고 있습니다.
curr_epch=`date +%s`
curr_epch_buff=`expr $curr_epch - 1800`
ls -l --time-style=+"%s" | grep .part | awk '{ if (($6 >= $curr_epch_buff)) print $6 }'
그러나 위의 코드는 언급된 조건에 관계없이 결과를 제공합니다.
디버깅하기 위해 이 두 값의 차이를 계산하려고 하면 예상한 결과를 얻지 못하고 대신 다음과 같은 결과가 나타납니다.$6다음과 같이 인쇄됩니다.
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - $curr_epch_buff) }'
그러나 위 쿼리를 사용하여 정적 숫자를 빼려고 하면 예상한 결과가 나타납니다.
ls -l --time-style=+"%s" | grep .part | awk '{ print (expr $6 - 200) }'
위에 언급된 첫 번째 및 두 번째 코드 세트에 어떤 문제가 있는지 알려주실 수 있나요?
답변1
--see
$(...)
대신 사용`...`
https://mywiki.wooledge.org/BashFAQ/082
bash는 산술 연산을 수행할 수 있으므로 expr
.
파싱되지 않음ls
curr_epch_buff=$( date -d '30 minutes ago' +%s )
for file in *.part; do
file_mtime=$( stat -c '%Y' "$file" )
if (( file_mtime < curr_epch_buff )); then
echo "$file is older than 30 minutes"
fi
done
문제 awk '{ print (expr $6 - $curr_epch_buff) }'
:
curr_epch_buff
고려awk 변수. 설정되지 않았습니다.- awk에서는
$n
연산자처럼 작동하여 참조되는 필드 번호의 내용을 반환합니다.n
- 숫자 컨텍스트에서 설정되지 않은 변수는 숫자 0으로 처리됩니다.
- so 는 전체 레코드와 동일합니다
$curr_epch_buff
.$0
expr
또한 설정되지 않은 변수입니다expr $6
문자열 연결이고 결과는 내용입니다.$6
$6 - $0
- 레코드는 숫자로 시작하지 않고 반환된 파일 권한 문자열로 시작합니다.
ls -l
- awk는 숫자로 시작하지 않는 문자열을 0으로 처리합니다.
- 레코드는 숫자로 시작하지 않고 반환된 파일 권한 문자열로 시작합니다.
최종 결과는 값입니다.$6
답변2
if [ -z "$(find . -name '*.part' -mmin -30)" ]
then
echo ".part file is old"
else
echo ".part file is recent"
fir