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