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 표현을 지원하는 shopt
Bash를 사용하고 있을 것입니다 . 설정하면 현재 디렉터리의 하위 디렉터리에서도 일치하는 모든 파일 로 확장됩니다 .**/
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는 공백을 끊는 것이 아니라 배열 요소 경계를 추적합니다. [[ ]] 테스트 뒤의 세미콜론도 선택 사항입니다.