재생 목록 파일에서 입력을 받아 비디오 파일 이름을 일괄 변경합니다.

재생 목록 파일에서 입력을 받아 비디오 파일 이름을 일괄 변경합니다.

디렉토리의 파일:

$ ls | sort -n

1.mp4
2 .mp4
3 .mp4
4 .mp4
5 .mp4
6 .mp4
7 .mp4
8 .mp4
9 .mp4
10 .mp4

재생 목록 파일의 파일 이름 목록:

$ cat playlist.m3u8

1- Introduction-OxIDLw0M-m0.mp4
2 - How React Works-pKYiKbf7sP0.mp4
3 - React Setup (with CDN)-SAX6RMEFVM4.mp4
4 - React Components-Fis_Q3rkgtM.mp4
5 - State-yuN4EMjR4K4.mp4
6 - React Dev Tools--XQ2zCdxw0I.mp4
7 - DOM Events--ZB8I2PmiOw.mp4
8 - Changing State (and 'this')-XJzDF9bj368.mp4
9 - Intro to Forms-BVbdZ1133JU.mp4
10 - Create React App-5QwNCX3UbXc.mp4

파일 이름은 숫자로 시작됩니다. 재생 목록 파일에 나열된 이름과 해당 번호로 디렉터리의 파일 이름을 바꾸려면 어떻게 해야 합니까? 결과는 다음과 같습니다.

$ ls | sort -n


1- Introduction-OxIDLw0M-m0.mp4
2 - How React Works-pKYiKbf7sP0.mp4
3 - React Setup (with CDN)-SAX6RMEFVM4.mp4
4 - React Components-Fis_Q3rkgtM.mp4
5 - State-yuN4EMjR4K4.mp4
6 - React Dev Tools--XQ2zCdxw0I.mp4
7 - DOM Events--ZB8I2PmiOw.mp4
8 - Changing State (and 'this')-XJzDF9bj368.mp4
9 - Intro to Forms-BVbdZ1133JU.mp4
10 - Create React App-5QwNCX3UbXc.mp4

답변1

while read -r i ; do
    file=$(echo $i | cut -d- -f1).mp4
    if [ -e "$file" ]; then
        mv "$file" "$i"
    fi      
done < playlist.m3u8

for i in ?*.mp4; do
    mv "$i" "$(grep -xm1 "${i%.*}"'-.*\.mp4' playlist.m3u8)"
done

답변2

가 있는 경우 aka를 사용하는 한 가지 방법 bash4+은 다음과 같습니다 .mapfilereadarray

#!/usr/bin/env bash

shopt -s nullglob

rawfiles=(*.mp4)
mapfile -t files < <(printf '%s\n' "${rawfiles[@]}"| sort -n)
mapfile -t playlistfile < <(sort -n playlist.m3u8)

for i in "${!files[@]}"; do
   mv -v  "${files[$i]}" "${playlistfile[$i]}"
done

Linux에서 출력

renamed '1.mp4' -> '1- Introduction-OxIDLw0M-m0.mp4'
renamed '2 .mp4' -> '2 - How React Works-pKYiKbf7sP0.mp4'
renamed '3 .mp4' -> '3 - React Setup (with CDN)-SAX6RMEFVM4.mp4'
renamed '4 .mp4' -> '4 - React Components-Fis_Q3rkgtM.mp4'
renamed '5 .mp4' -> '5 - State-yuN4EMjR4K4.mp4'
renamed '6 .mp4' -> '6 - React Dev Tools--XQ2zCdxw0I.mp4'
renamed '7 .mp4' -> '7 - DOM Events--ZB8I2PmiOw.mp4'
renamed '8 .mp4' -> '8 - Changing State (and '\''this'\'')-XJzDF9bj368.mp4'
renamed '9 .mp4' -> '9 - Intro to Forms-BVbdZ1133JU.mp4'
renamed '10 .mp4' -> '10 - Create React App-5QwNCX3UbXc.mp4'

이것은 단 하나의 라이너입니다.

rawfiles=(*.mp4); mapfile -t files < <(printf '%s\n' "${rawfiles[@]}"| sort -n); mapfile -t playlistfile < <( sort -n playlist.m3u8); for i in "${!files[@]}"; do  mv -v  "${files[$i]}" "${playlistfile[$i]}"; done

답변3

다음과 같이 사용할 수 있습니다 paste.

paste <(ls -1 *mp4 | sort -n) playlist.m3u8  | sed 's,\t,\t",' | sed 's,^,",' | sed 's,mp4,mp4",g' | xargs -L1 mv

결과:

$ ll
total 4.0K
-rw-r--r-- 1 ja users   0 Feb 24 15:09 9 - Intro to Forms-BVbdZ1133JU.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 8 - Changing State (and 'this')-XJzDF9bj368.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 7 - DOM Events--ZB8I2PmiOw.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 6 - React Dev Tools--XQ2zCdxw0I.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 5 - State-yuN4EMjR4K4.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 4 - React Components-Fis_Q3rkgtM.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 3 - React Setup (with CDN)-SAX6RMEFVM4.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 2 - How React Works-pKYiKbf7sP0.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 10 - Create React App-5QwNCX3UbXc.mp4
-rw-r--r-- 1 ja users   0 Feb 24 15:09 1- Introduction-OxIDLw0M-m0.mp4

이 특별한 경우에는 작동하지만 참고하세요.ls의 출력을 구문 분석하는 것은 좋은 생각이 아닙니다..

관련 정보