여기 누군가가 이 질문을 했는지는 모르겠지만 제 질문입니다. 이름이 다음과 같은 파일이 있습니다 dir1
.
File 1.mp4
File 2.mp4
etc..
이제 디렉토리에 dir2
다음과 같은 항목이 있습니다.
Sub 1.srt
Sub 2.srt
etc..
Sub 1.srt
가 되도록 이름을 바꾸려면 어떻게 해야 합니까 File 1.srt
? 따라서 기본적으로 *.srt
모든 파일의 이름을 파일 이름으로 바꿉니다 *.mp4
. 두 디렉터리의 파일 수는 동일하며 사용하는 printf %s\\n *
파일이 정렬됩니다.
답변1
두 디렉터리 모두 동일한 수의 파일을 포함하므로 두 배열에 파일 이름을 저장한 다음 배열 인덱스 목록에서 각 인덱스의 이름을 바꾸는 방법이 있습니다(두 배열의 길이가 동일하므로).
mp4paths=(dir1/*.mp4) # save mp4 file names in array
mp4names=("${mp4paths[@]##*/}") # remove leading path components
name=("${mp4names[@]%.*}") # remove extension
srt=(dir2/*.srt) # save srt file names in array
for i in "${!srt[@]}" # for each index in the list of array indices
do # do stuff here...
mv "${srt[$i]}" dir2/"${name[$i]}".srt
done
이는 모든 유형의 파일 이름에 적용됩니다.
"모의 실행"의 경우 mv
로 바꿉니다 printf '%s -> %s\n'
.
답변2
paste -d= <(ls dir2/*.srt) <(ls dir1/*.mp4) |
perl -nlE 's/=dir1(.*).mp4/" "dir2$1.srt/; say("mv \"",$_, "\"")' |
bash
- 첫 번째 줄은 다음 줄을 생성합니다
dir2/sub 1.srt=dir1/file 1.mp4
- 두 번째 줄은 다음으로 변경됩니다.
mv "dir2/sub 1.srt" "dir2/file 1.srt"
- 세 번째 줄은 다음 줄을 실행합니다.
답변3
이러한 파일이 다음과 같은 경우일 수 있다고 가정합니다.아니요문자 그대로 "File 1.mp4" 및 "Sub 1.srt"라는 이름이 지정되면(그렇더라도 스크립트는 계속 작동하지만) 두 파일 세트의 숫자는 다음과 같습니다.
#! /bin/sh
dir1='./dir1'
dir2='./dir2'
find "$dir1" -maxdepth 1 -name '*.mp4' | while IFS= read f ; do
num=$(echo "$f" | sed -e 's/^.* \([0-9]\+\)\.mp4/\1/')
subtitle=$(find "$dir2" -maxdepth 1 -name "* $num.srt" | head -1)
if [ -n "$subtitle" ] ; then
bn=$(basename "$f" .mp4)
mv "$subtitle" "$dir2/$bn.srt"
fi
done
참고: 이는 이름에 줄바꿈이 포함된 파일을 제외한 모든 파일에 적용됩니다. 이는 head -1
동일한 번호의 .srt 파일이 여러 개 있는 경우 스크립트가 실패하는 것을 방지하기 위한 것입니다. 이 경우 발견된 첫 번째 파일의 이름이 바뀌고 나머지 파일은 무시됩니다.
자막을 .mp4 파일과 동일한 디렉터리로 이동하려면 해당 줄을 mv
다음과 같이 변경하세요.
mv "$subtitle" "$dir1/$bn.srt"