2016-08-07 6 views
2

Bash에 대한 지식이 부족하기 때문에 사소한 문제가 발생합니다. 41 폴더의 'Apps'디렉토리가 있습니다. 각 폴더에는 glue1.css 파일이 포함 된 css 하위 디렉토리가 있습니다. 내 목표는 bash 루프를 통해 해당 CSS 파일을 제거하는 것입니다,하지만 두 개의 폴더를 면제해야합니다 : adglue-resources.여러 조건이있는 Bash if 문

CSS 파일이 없으므로 ad 폴더를 제외해야합니다. 나는 실행시 발생하는 다음과 같은 오류를 방지하려면 : 여기

Apps 
    ad 
    css 
     (empty) 
    glue-resources 
    css 
     glue1.css (keep this file!) 
    profile 
    css 
     glue1.css (remove this file!) 
    ... 

내가 지금까지 가지고있는 코드는 다음과 같습니다

rm: ad/css/glue1.css: No such file or directory 

은 (간결 41 개 폴더를 결여)이 가상 디렉토리를 생각해 보자. 상위 디렉토리 경로가 glue-resources/css/ 또는 ad/css/이 아닌 경우 glue1.css 파일에서 rm을 호출해야합니다.

for dir in **/css/; do 
if [[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]]; then 
    rm "${dir}"glue1.css 
fi 
done 

위의 코드 결과는 작동하지 않습니다. 동일한 'No such file or directory'오류가 발생하고 glue-resources/css에있는 glue1.css 파일이 제거되었습니다. 왜 작동하지 않는지 잘 모르겠습니다. [[]]을 사용하면 여러 조건을 조합 할 수 있습니다.

제가 생각하기에 문제는 제가 bash에서 여러 조건이 어떻게 작동하는지 이해하지 못한다고 생각합니다. 다음 버전의 코드가 작동합니다.

for dir in **/css/; do 
if [[ "${dir}" != 'glue-resources/css/' ]]; then 
    rm "${dir}"glue1.css 
fi 
done 


for dir in **/css/; do 
if [[ "${dir}" != 'ad/css/' ]]; then 
    rm "${dir}"glue1.css 
fi 
done 

if 명령문에 여러 조건을 추가하려는 시도가 실패했습니다.

+0

[shellcheck] (http://www.shellcheck.net)을 시험해 보면 [이번 호] (https://github.com/koalaman/shellcheck/wiki/SC2055)가 자동으로 감지됩니다. –

답변

2

때문에, 다음과 같은 조건이 항상 true를 돌려줍니다 :

[[ "${dir}" != 'glue-resources/css/' || "${dir}" != 'ad/css/' ]] 

을 나는 의심을 무엇 원하는 항목 :

[[ "${dir}" != 'glue-resources/css/' && "${dir}" != 'ad/css/' ]] 

&&은 logica입니다. 땅. 동시에 두 조건을 모두 충족해야합니다.

0

은 아마도 당신은 루프를 방지하고 같은 것을 할 수있는 : ||는 논리 OR을 나타냅니다

find . -path ./glue-resources -prune -o -name glue1.css | xargs -I [] rm []