폴더 및 하위 폴더에 If 문 사용 [닫기]

폴더 및 하위 폴더에 If 문 사용 [닫기]

IF 문을 사용하는 데 문제가 있습니다.

디렉토리가 스크립트에 전달되고 해당 디렉토리(하위 폴더 수에 관계없이)에는 파일이 포함됩니다. .txt최종 .tmp목표는 .tmp모든 파일을 한 폴더에 복사하고 .txt파일을 다른 폴더에 복사하는 것입니다.

현재 다음이 있습니다:

shopt -s nullglob
if [[ -n $(echo *.txt) ]]; then

elif [[ -n $(echo *.tmp) ]]; then

else
    echo "nothing Found"
fi

하지만 하위 디렉터리는 확인하지 않습니다. 뭔가 빠진 것이 있나요?

답변1

다음 명령을 사용해야 합니다 find.

find "$start_dir" -type f -name '*.txt' -exec cp -t "$txt_destination" '{}' +
find "$start_dir" -type f -name '*.tmp' -exec cp -t "$tmp_destination" '{}' +

답변2

하지만 하위 디렉터리는 확인하지 않습니다. 뭔가 빠진 것이 있나요?

글쎄요, 일반 glob은 하위 디렉터리로 재귀되지 않습니다. 당신이 그것을 사용하고 있기 때문에 아마도 당신은 그것을 설정하는 한 재귀 glob 표현을 지원하는 shoptBash를 사용하고 있을 것입니다 . 설정하면 현재 디렉터리의 하위 디렉터리에서도 일치하는 모든 파일 로 확장됩니다 .**/shopt -s globstar**/*.txt*.txt

답변3

ikkachu는 bash에서 재귀적 글로빙이 가능하지만 방법은 설명하지 않습니다. 이제 방법을 보여드리겠습니다.

shopt -s globstar extglob nullglob
txt_files=(**/!(*test*|*sample*).txt)
if (( ${#txt_files} )); then
    cp -t "${txt_files[@]}" $txt_destination
fi

tmp_files=(**/!(*test*|*sample*).tmp)
if (( ${#tmp_files} )); then
    cp -t "${tmp_files[@]}" $tmp_destination
fi

내 기억이 정확하다면 zsh는 10년 넘게 이 작업을 수행할 수 있었습니다. Bash 대신 zsh를 사용하는 경우:

setopt extendedglob
txt_files=( **/*.txt~*(test|sample)*(N.) )
if (( $#txt_files )) cp -t $txt_files $txt_destination

tmp_files=( **/*.tmp~*(test|sample)*(N.) )
if (( $#tmp_files )) cp -t $tmp_files $tmp_destination

또는 그 이상의 C 스타일:

setopt extendedglob nullglob
txt_files=( **/*.txt~*(test|sample)*(.) )
if [[ $#txt_files != 0 ]] {
    cp -t $txt_files $txt_destination
}

tmp_files=( **/*.tmp~*(test|sample)*(.) )
if [[ $#tmp_files != 0 ]] {
    cp -t $tmp_files $tmp_destination
}

나는 거기에 따옴표를 잊지 않았습니다. zsh는 공백을 끊는 것이 아니라 배열 요소 경계를 추적합니다. [[ ]] 테스트 뒤의 세미콜론도 선택 사항입니다.

관련 정보