다른 디렉터리의 파일 이름을 기반으로 디렉터리의 파일 이름 바꾸기

다른 디렉터리의 파일 이름을 기반으로 디렉터리의 파일 이름 바꾸기

여기 누군가가 이 질문을 했는지는 모르겠지만 제 질문입니다. 이름이 다음과 같은 파일이 있습니다 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"

관련 정보