디렉터리에 특정 단어로 시작하는 하위 디렉터리가 있는지 확인하는 스크립트를 작성 중입니다.
이것은 지금까지 내 스크립트입니다.
#!/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"
와 같이 값을 설정하는 것을 고려해 보세요 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.