![if 절이 작동하지 않는 경우](https://linux55.com/image/190516/if%20%EC%A0%88%EC%9D%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EA%B2%BD%EC%9A%B0.png)
아래 코드에서 각 파일을 반복하면서 파일 이름이 소문자 및 특수 문자와 일치하는지 확인하고 20자 미만인지 확인하지만 분명히 내 if 절이 작동하지 않는 것 같습니다. 누구든지 조언을 해줄 수 있나요?
#/bin/bash
Count=$(find . -type f | wc -l)
echo $Count
if [[ ( $Count -ge 2 ) && ( $count -lt 1000 ) ]]
then
for file in *;
do
if [[ $file == [a-z0-9._-] && ${#file} -le 20 ]];
echo "inside if $file ${#file}"
then
[ -f "$file" ] || continue
#Check the extension of the file
ext="${file##*.}"
#check if the file name is ending with .txt push to text directory
if [ $ext == "txt" ]
then
mkdir -p text
mv $file text
fi
#if bash scripts are there push to scripts directory
if [ $ext == "sh" ]
then
mkdir -p Scripts
mv $file Scripts
fi
#if log scripts are there push to log directory
if [ $ext == "log" ]
then
mkdir -p logs
mv $file logs
fi
#if music files are there push to music directory
if [[ $ext == "mp3" || $ext == "flac" ]]
then
mkdir -p Music
mv $file Music
fi
fi
done
fi
답변1
여기에는 몇 가지 사소한 구문 문제가 있습니다(대부분은shellcheck.net그것을 지적할 것입니다 – 추천합니다! ), 하지만 가장 큰 질문부터 시작하겠습니다.
if [[ $file == [a-z0-9._-] && ${#file} -le 20 ]];
echo "inside if $file ${#file}"
then
...
여기서 첫 번째 문제는 glob 패턴 [a-z0-9._-]
일치 입니다.단일 문자. 파일 이름이 한 문자보다 길면 일치하는 항목이 없습니다. 파일 이름에 해당 세트의 문자만 포함되도록 하려면 대신 정규식 테스트를 사용하십시오. ( glob 패턴 일치는 $file =~ ^[a-z0-9._-]+$
표현식 [[ ]]
내에서 =
수행되고 정규식 일치는 수행됩니다.) 길이 검사를 여기에 넣을 수도 있습니다 ( "이전 것의 1에서 20 사이"를 의미).==
=~
$file =~ ^[a-z0-9._-]{1,20}$
{1,20}
if
두 번째 문제는 그 사이에 여러 명령이 있을 때 then
그 상태는 다음과 같습니다.마지막 하나표현식이 참 또는 거짓으로 간주되는지 여부를 결정합니다. 명령은 echo
거의 항상 성공하므로 표현식은 true이고 then
절은 거의 항상 실행됩니다. echo
다른 곳으로 옮기거나 완전히 삭제하는 것이 좋습니다 .
이제 작은 질문이 있습니다. shebang(첫 번째 줄)은 #!
가 아니라 로 시작해야 합니다 #
. Count
그리고 count
다른 변수입니다(경우가 중요합니다!). 테스트 에서는 이상한 구문 분석을 피하기 위해 [ ]
변수를 큰따옴표로 묶어야 하며 ==
이는 비표준이므로 대신 사용 하십시오 [ "$ext" = "txt" ]
.[ $ext == "txt" ]
echo "$Count"
mv "$file" text
if
마지막으로 확장을 추출하는 부분을 단일 명령문으로 대체한 다음 이를 기반으로 일련의 명령문을 사용하고 싶습니다 case
(이것이 거의 case
의도된 목적입니다).
case "$file" in
*.txt )
mkdir -p text
mv "$file" text ;;
*.sh )
mkdir -p Scripts
mv "$file" Scripts ;;
*.log )
mkdir -p logs
mv "$file" logs ;;
*.mp3 | *.flac )
mkdir -p Music
mv "$file" Music ;;
esac