내 Plex 미디어 서버에 Enigma2 FreeSat 레코더가 연결되어 있습니다.
Plex는 Enigma2에서 파일을 보고 재생하는 데는 잘 작동하지만 파일 이름 지정으로 인해 매력적이지 않습니다.
이 형식으로 파일 이름을 바꾸는 방법:
yyyymmdd nnnn - channel - title.*
예를 들어 20181128 2100 - BBC One HD - The Apprentice입니다. *
도착하다:
title - dd-mm-yyyy - channel.*
예를 들어 The Apprentice - 2018년 11월 28일 - BBC One HD. *
(따라서 명령줄에서 몇 분마다 실행할 수 있습니다).
이미 이름이 바뀐 파일의 이름을 바꾸려고 시도하지 않도록 첫 번째 형식의 파일만 일치하는지 확인하고 싶습니다.
나중에 Docker 컨테이너로 실행하고 싶습니다.
답변1
다음 쉘스크립트가 이를 수행할 수 있다고 생각합니다.
원본 파일 이름의 날짜와 시간이 숫자인지 확인하고 그렇다면 이름을 원하는 형식으로 다시 정렬합니다.
그렇지 않으면 파일을 건너뛰므로 이미 수정된 파일은 건드리지 않습니다.
디렉터리를 파일 위치로 변경하고 스크립트를 실행합니다.
#!/bin/bash
re='^[0-9]+$'
for i in *.*
do
str="$i"
# echo "${str} -----"
date=${str:0:8}
time=${str:9:4}
if [[ $date =~ $re ]] && [[ $time =~ $re ]]
then
channel=${i#*- }
channel=${channel% -*}
title=${i##*- }
ext=${title##*.}
title=${title%%.*}
date=${date:6:2}-${date:4:2}-${date:0:4}
mv -nv "$i" "$title - $date - $channel.$ext"
fi
done
답변2
이것을 출발점으로 사용할 수 있습니다.
#!/bin/bash
regexp='^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] -'
while read l; do
[[ ! ${l} =~ ${regexp} ]] && continue
ext=${l##*.}
yyyymmdd=${l%% *}
yyyymmdd="${yyyymmdd:6:2}-${yyyymmdd:4:2}-${yyyymmdd:0:4}"
channel=$(echo ${l} | awk -F- '{print $2}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=$(echo ${l} | awk -F- '{print $NF}' | sed -e 's!^[[:space:]]*!!' -e 's![[:space:]]*$!!')
title=${title%.*}
echo "${title} - ${yyyymmdd} - ${channel}.${ext}"
done
exit 0
그러면 정규식이 "yyyymmdd nnnn -"으로 설정되어 해당 문자열과 일치하지 않는 모든 항목을 필터링할 수 있습니다. 그런 다음, 읽는 각 줄(find(1), ls(1) 등의 출력일 수 있음)에 대해 정규식이 일치하는지 확인합니다. 그렇다면 다음 줄로 점프하세요.
다음 변수 할당 세트를 통해 원하는 다양한 구성요소를 얻을 수 있습니다. 확장 할당은 파일 확장자를 가져오는 것입니다. yyyymmdd는 연도, 월, 일을 가져옵니다. 그런 다음 변경 가능한 하위 문자열을 사용하여 형식을 다시 지정합니다.
채널과 제목이 대시로 구분되어 있으므로 awk(1)을 사용하여 적절한 필드를 가져오는 것이 더 쉬울 것이라고 생각했습니다. 다음 sed는 문자열 앞뒤의 모든 공백을 잘라냅니다. 마지막 제목은 파일 확장자를 제거하는 것입니다.
모든 변수를 얻은 후 해당 행을 인쇄하십시오. 이는 다음으로 쉽게 대체될 수 있습니다.
mv ${l} "${title} - ${yyyymmdd} - ${channel}.${ext}"
파일 이름을 바꿉니다.