특정 단어로 시작하는 하위 디렉터리에 대해 특정 디렉터리를 확인하는 스크립트를 작성 중입니다.
지금까지 내 스크립트는 다음과 같습니다.
#!/bin/bash
function checkDirectory() {
themeDirectory="/usr/share/themes"
iconDirectory="/usr/share/icons"
# I don't know what to put for the regex.
regex=
if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
echo "Directories exist."
else
echo "Directories don't exist."
fi
}
regex
그렇다면 특정 디렉토리에 특정 단어로 시작하는 폴더가 있는지 확인하려면 어떻게 해야 할까요 ?
답변1
-d
정규 표현식을 허용하지 않고 파일 이름을 허용합니다. 간단한 접두사만 확인하려면 와일드카드로 충분합니다.
exists=0
shopt -s nullglob
for file in "$themeDirectory"/word* "$iconDirectory"/* ; do
if [[ -d $file ]] ; then
exists=1
break
fi
done
if ((exists)) ; then
echo Directory exists.
else
echo "Directories don't exist."
fi
nullglob
일치하는 항목이 없으면 와일드카드를 빈 목록으로 확장합니다. 더 큰 스크립트에서는 하위 쉘의 값을 변경하거나 필요하지 않은 경우 이전 값을 다시 설정하십시오.
답변2
주어진 패턴/접두사와 일치하는 디렉토리만 찾으려면 다음을 사용할 수 있다고 생각합니다 find
.
find /target/directory -type d -name "prefix*"
또는 당신이 원한다면즉각적인하위 디렉터리:
find /target/directory -maxdepth 1 -type d -name "prefix*"
물론 -regex
실제 정규식 일치가 필요한 경우도 있습니다. (주의: -maxlength가 gnu-ism인지 기억이 나지 않습니다.)
(업데이트) 맞습니다. if 문을 원하셨습니다. Find는 항상 0을 반환하므로 반환 값을 사용하여 찾은 항목이 있는지 확인할 수 없습니다(grep과 달리). 그러나 예를 들어 줄 수를 셀 수 있습니다. 출력을 파이프하여 wc
개수를 얻은 다음 0이 아닌지 확인합니다.
if [ $(find /target/directory -type d -name "prefix*" | wc -l ) != "0" ] ; then
echo something was found
else
echo nope, didn't find anything
fi
답변3
변수 이름은 regex
잘 선택되지 않지만 값을 "$1"
like 로 설정하는 것이 좋습니다 regex="$1"
. 다음 단계는 if
명령문을 다음과 같이 변경하는 것입니다.
if [ -d "$themeDirectory/$regex" && -d "$iconDirectory/$regex" ]; then
에게
if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
스크립트는 다음과 같습니다.
function checkDirectory() {
themeDirectory="/usr/share/themes"
iconDirectory="/usr/share/icons"
# I don't know what to put for the regex.
regex="$1"
if [ -d "$themeDirectory/$regex" ] && [ -d "$iconDirectory/$regex" ]; then
echo "Directories exist."
else
echo "Directories don't exist."
fi
}
셸에서 다음을 통해 스크립트를 소싱할 수 있습니다.
. /path/to/script
이제 함수를 사용할 준비가 되었습니다.
checkDirectory test
Directories don't exist.