바꾸기 찾기를 사용하여 배치 파일 이름 바꾸기

바꾸기 찾기를 사용하여 배치 파일 이름 바꾸기

Bash를 사용하여 많은 수의 파일 이름을 일괄적으로 바꾸는 방법은 무엇입니까? 기존 이름과 "컨텍스트 매핑"을 기반으로 각 파일의 새 이름을 구성해야 합니다. 무엇이라고 부를지 잘 모르겠습니다. 이름 조각화입니다.

다음과 같은 파일이 많이 있습니다.

001.jpg
003.jpg
004.jpg
007.jpg
...

그리고 다음과 같은 지도가 있습니다:

001,white
003,grey
004,red
007,green
...

이제 001.jpg가 001-white.jpg 등이 되도록 모든 파일의 이름을 바꾸고 싶습니다.

어떻게 해야 하나요?

답변1

bash4: 배열에 대한 첫 번째 읽기 매핑

declare -A arr2
while IFS=, read -r -a arr; do
    arr2[${arr[0]}]="${arr[1]}";
done < mapfile.txt

그런 다음 이름을 바꾸세요

for f in [0-9][0-9][0-9].jpg; do
    if [[ "${arr2[${f%.*}]+_}" ]]
    then
        mv -- "${f}" "${f%.*}"-"${arr2[${f%.*}]}"."${f##*.}";
    else
        mv -- "${f}" "${f%.*}"-default."${f##*.}";
    fi
 done

답변2

간단히 실행할 수 있습니다

join -t. -j1 <(tr , . < map) filelist | sed 's/\./-/' | paste filelist - | xargs -L1 mv

map컨텍스트 맵은 어디에 있고 filelist파일 목록은 어디에 있습니까? 조인은 분할되어 .첫 번째 필드를 조인 값으로 사용합니다. 두 목록을 모두 정렬해야 합니다. paste그런 다음 각 줄을 filelist새로 생성된 파일 이름과 함께 붙이고 각 줄을 xargs호출합니다 mv.

답변3

여기 있어요:

for file in [0-9][0-9][0-9].jpg;do
    name="${file%%.*}" # Remove extension
    map="$(grep "$name" map_file | cut -d',' -f 2)"
    echo mv "$file" "$name-$map".jpg
done

이는 "map"이 파일에 있다고 가정합니다 map_file. 최신 버전의 Bash에서는 map_file이름을 바꿀 각각의 새 파일을 반복하는 대신 이 파일을 연관 배열로 변환하여 편의를 위해 사용할 수도 있습니다 .

그건 그렇고, 이것은 단지 echo명령 일 뿐입니다 mv. 모든 것이 괜찮다고 생각되면 삭제 echo하여 실제로 이름을 바꿀 수 있습니다.

답변4

< map sed 's/\([^,]*\),\(.*\)/mv -- "\1.jpg" "\1-\2.jpg"/' | sh -x

(매핑 파일에 ", $, 백슬래시 또는 백틱 문자가 포함되어 있지 않다고 가정합니다.

관련 정보