폴더의 파일 이름을 다른 이름으로 바꿉니다.

폴더의 파일 이름을 다른 이름으로 바꿉니다.

다른 폴더에 여러 개의 .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

다음 두 가지 직접적인 이유로 시도가 실패했습니다.

  1. d디렉토리를 반복하기 위해 변수를 사용하고 있지 않습니다.
  2. 반복 글로브에는 최종 파일이 포함되지 않고 하위 디렉터리만 포함됩니다.

편집: 첫째, 초기 glob이 pdb 파일만 선택하기 때문에 검사를 수행할 필요가 없는 향상된 간단한 답변이 있습니다.

for one-path in root-directory/*/*.pdb
do
  mv "$one-path" "$(dirname $one-path)/test.pdb"
done

basenamebash 셸과 두 가지 핵심 유틸리티( 및 dirname) 를 사용하여 원래 잘못된 답변과 몇 가지 의견이 아래에 나와 있습니다 .

for one-path in root-directory/*/*
do
  [[ "$(basename "$one-path")" =~ pdb$ ]] \
  &&  mv "$one-path" "$(dirname $one-path)/test.pdb"
done
  1. root-directory사용 중인 절대 경로 지정입니다.
  2. root-directory/*/*하위 디렉토리뿐만 아니라 정의한 경우 실제 파일을 반환하는 glob입니다.
  3. =~제한된 정규식 테스트를 허용하는 bash 쉘 확장입니다. 이 경우 문자열은 다음으로 끝납니다.pdb
  4. &&논리 AND입니다. if간단히 말해서 ...를 대체하는 일반적인 관용구 입니다 then(이전 줄의 백슬래시 연속 기호를 잊지 마세요).

관련 정보