2012-06-06 2 views
0

내 질문에 대한 답변은 코드 효율성 및 단순성에 관한 질문보다 간단합니다. 시나리오는 다음과 같습니다. for 루프를 사용하여 사용자가 각 사용자 홈 디렉토리에있을 때/사용자를 반복하는 bash 스크립트를 만들고 싶습니다. 두 개의 다른 디렉토리가 스타일로 존재하는지 확인하고 싶습니다.bash의 조건문 작성 (if 문)

for USER in /Users/*; do 
    if [ -d "$USER/Library/Caches/com.spotify.Client" ]; then 
     rm -rf "$USER/Library/Caches/com.spotify.Client" 

...하지만 여러 개의 디렉토리를 확인해야합니다. 어떻게하면 가장 우아한 방법으로 이것을 할 수 있습니까? 일련의 if 문을 사용하는 것을 피하고 싶지만이를 수행하는 가장 좋은 방법을 모릅니다.

마지막으로 find 명령을 사용하여 파일을 찾은 다음 find의 결과 (즉, 발견 된 파일의 경로)를 변수로 설정하고 다른 명령으로 입력하고 싶습니다. 고맙습니다.

나는 당신의 요구 사항을 이해 것과

답변

2

, I 둥지 것 for 루프 :

subdirs=(
    "Library/Caches/com.spotify.client" 
    "some/other/subdir/" 
) 

for homedir in /Users/*; do 
    for subdir in "${subdirs[@]}"; do 
     dir="$homedir/$subdir" 
     if [[ -d "$dir" ]]; then 
      rm -rf "$dir" 
     fi 
    done 
done 
+0

이 내가 원하는 것을 정확하게! 나는 여기에 파일을 가지고 똑같은 일을 할 수 있었 을까? –

+0

위의 오타가 있습니다 :'subddir'은'subdir '이어야합니다. 또한 다중 행 변수 할당은 my bash 3.2.48 시스템에서 작동하지 않습니다 (Mac OS X 10.7.4). 첫 번째 행만 사용합니다. – mklement0

+0

@ DeanA.Vassallo : 여기 문서를 사용하려면 ('\ n'을 실제 줄 바꿈으로 바꾸고 경로를 인용하지 마십시오.)'read -r -d ''subdirs << EOF \ nLibrary/Caches/com.spotify. 클라이언트 \ nsome/기타/subdir \ nEOF' – mklement0

1

다음은 위 @ 데이비드 Wolever의 대답을 기반으로; 이 버전들은 더 짧아서 쉘이 앞쪽으로 더 많이 움직이게합니다.

인라인 중간 (배열) 변수를 사용하지 않고, 단일 루프 버전 :

for dir in /Users/*/'Library/Caches/com.spotify.client/' /Users/*/'some/other/subdir/'; do 
    [[ -d "$dir" ]] && rm -rf "$dir" 
done 

배열 변수 버전 :

subdirs=(
    'Library/Caches/com.spotify.client/' 
    'some/other/subdir/' 
) 

for subdir in "${subdirs[@]}"; do 
    for dir in /Users/*/"$subdir"; do 
     [[ -d "$dir" ]] && rm -rf "$dir" 
    done 
done