다른 폴더에 여러 개의 .pdb 파일이 있습니다. 전체 디렉터리를 반복하고 모든 파일의 이름을 특정 이름 test.pdb로 지정하려면 어떻게 해야 합니까?
샘플 구조
file1
file1.pdb
xyz.txt
file2
file2.pdb
xyz.txt
file3
file3.pdb
xyz.txt
필수 출력 구조
file1
test.pdb
xyz.txt
file2
test.pdb
xyz.txt
file3
test.pdb
xyz.txt
지금 사용하고 있는 코드는 다음과 같습니다.
for d in */ ; do
mv *.pdb test.pdb
done
하지만 작동하지 않습니다.
답변1
각 디렉터리에 .pdb 파일이 있다고 가정합니다(그렇지 않으면 이 질문은 의미가 없습니다).
for dir in */ ; do
[ -f "$dir/*.pdb" ] && mv "$dir/*.pdb" "$dir/test.pdb"
done
답변2
다음 두 가지 직접적인 이유로 시도가 실패했습니다.
d
디렉토리를 반복하기 위해 변수를 사용하고 있지 않습니다.- 반복 글로브에는 최종 파일이 포함되지 않고 하위 디렉터리만 포함됩니다.
편집: 첫째, 초기 glob이 pdb 파일만 선택하기 때문에 검사를 수행할 필요가 없는 향상된 간단한 답변이 있습니다.
for one-path in root-directory/*/*.pdb
do
mv "$one-path" "$(dirname $one-path)/test.pdb"
done
basename
bash 셸과 두 가지 핵심 유틸리티( 및 dirname
) 를 사용하여 원래 잘못된 답변과 몇 가지 의견이 아래에 나와 있습니다 .
for one-path in root-directory/*/*
do
[[ "$(basename "$one-path")" =~ pdb$ ]] \
&& mv "$one-path" "$(dirname $one-path)/test.pdb"
done
root-directory
사용 중인 절대 경로 지정입니다.root-directory/*/*
하위 디렉토리뿐만 아니라 정의한 경우 실제 파일을 반환하는 glob입니다.=~
제한된 정규식 테스트를 허용하는 bash 쉘 확장입니다. 이 경우 문자열은 다음으로 끝납니다.pdb
&&
논리 AND입니다.if
간단히 말해서 ...를 대체하는 일반적인 관용구 입니다then
(이전 줄의 백슬래시 연속 기호를 잊지 마세요).