목록을 사용하여 파일 이름 바꾸기

목록을 사용하여 파일 이름 바꾸기

내 디렉터리에 사용 가능한 파일이 있습니다.

filename15_1
filename15_2
filename15_3
filename15_4

등.

파일 이름을 바꾸는 방법에 대한 매핑 정보가 포함된 다른 파일이 있습니다. 이것은 CSV 파일입니다.

filename15_1,filename30_6
filename15_2,filename30_7
filename15_3,filename60_3
filename15_4,filename60_4
filename15_5,filename60_5
filename15_6,filename60_6

위의 매핑을 읽어서 이 4개 파일의 이름을 바꾸고 싶습니다. 맵 파일에는 디렉터리에 있는 실제 파일보다 더 많은 정보가 있습니다.

내 파일의 이름을 다음으로 바꿔야 합니다.

filename30_6
filename30_7
filename60_3
filename60_4

어떻게 해야 하나요?

참고: 저는 데이터베이스 배경을 가진 사람이고 Unix에 대해 아는 바가 거의 없습니다.

답변1

매핑 파일이 쉼표로 구분된 경우 다음을 수행할 수 있습니다.

while IFS=, read orig target; do
    mv "$orig" "$target"
done < mapping.txt

답변2

읽기 쉽고 간결한 방법은 awks system함수 입니다.

awk -F',' 'system("mv " $1 " " $2)' mappingFile.csv

입력 파일의 각 줄에 대해 명령이 실행됩니다.


명령 요약

  • awk표 형식 데이터 작업에 이상적인 Unix 유틸리티
  • -F','" F필드 구분 기호"는 쉼표입니다.
  • system("mv " $1 " " $2)입력 파일의 각 줄에 대해 실행
    • system(x)서브셸에서 x 실행
    • $1$2첫 번째와 두 번째 열을 각각 참조 하십시오 .
    • "mv " $1 " " $2빌드 명령의 암시적 연결
  • mappingFile.csv이 입력 파일을 사용하십시오

답변3

좋아요, 이것은 매우 어리석은 대답이지만:

sed -e 's/^/mv /' -e 's/,/ /' $mapping_file | sh 

답변4

위의 답변을 참고하여 다음과 같이 코드를 수정했는데 작동합니다.

cd $SRCE
for file in *
do

while IFS="," read srce target
do
if [[ $file = $srce ]] ; then 
mv "$srce" "$target"
fi
done < map_lst
done

관련 정보