독점적인 방식으로 노래의 파일 이름을 제공하는 일부 데이터 파일이 있습니다. 이제 이 데이터를 m3u 파일로 변환하여 모든 응용 프로그램에서 사용할 수 있도록 만들고 싶습니다. m3u 파일을 생성하기 위해 cronjob과 같은 것을 사용하고 싶지 않습니다. 왜냐하면 원하는 만큼 동적이지 않기 때문입니다.
그래서 저는 Named Pipe를 사용하기로 결정했습니다. 내 시나리오는 다음과 같습니다.
-rw-rw-rw-+ 1 sjngm sjngm 33929 6. May 12:56 songstore-1.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-1.data.m3u
-rw-rw-rw- 1 sjngm sjngm 7750 6. May 12:56 songstore-2.data
prw-r--r-- 1 sjngm sjngm 0 6. May 18:38 songstore-2.data.m3u
:
파일에 대해 한 번 실행되는 스크립트는 제대로 작동하는 것 같습니다.
#/bin/bash
file="$1"
echo "#EXTM3U"
paste -d '\n' \
<(tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/') \
<(tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi')
이는 궁극적으로 다음 위치에 저장되어야 하는 쉘 스크립트 코드입니다 ~/.xprofile
.
cd ~/garage/songstores
ls -1 songstore-* |
paste - - |
while read in pipe; do
echo "$in..."
while true; do
~/shell-scripts/convert.sh "$in" > "$pipe"
done &
done
이 명령을 실행하면 루프가 에 나타납니다 ps
. m3u를 사용 하면 cat
출력이 한 번이 아닌 여러 번 나타납니다. 노래 라이브러리 파일은 실제로 비어 있으며 출력은 다음과 같습니다.
$ cat songstore-13.data.m3u
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
#EXTM3U
$
다음에 실행할 때 cat
행 수는 달라지지만 항상 두 개 이상의 행이 있게 됩니다. 아이디어는 cat
콘텐츠를 한 번만 표시하는 것입니다.
마찬가지로 스크립트 자체는 명령줄에서 단일 실행으로 실행될 때 작동합니다. 문제는 파이프와 파이프를 쓰는 방법(또는 읽는 방법)에 있습니다.
내가 이해하지 못하는 부분은 무엇이며 어떻게 해결할 수 있습니까?
답변1
두가지:
1) 외부 루프 스크립트에 절전 모드를 적용했습니다.
for f in /home/sjngm/garage/songstores-*.data; do
echo "$f..."
while true; do
/home/sjngm/shell-scripts/convert.sh "$f" > "$f.m3u"
sleep 2
done &
done
2) 누구든지 이 작업을 수행하려는 경우: 명명된 파이프에 이미 쓰려고 할 때 프로세스 대체를 사용하는 것이 작동하지 않는 것 같습니다. 따라서 임시 파일을 사용하는 구식 방식이 여기서 도움이 됩니다.
#/bin/bash
file="$1"
tmpFile1="/tmp/`uuidgen`"
tmpFile2="/tmp/`uuidgen`"
tail -n +4 "$file" | grep "^#DESCRIPTION" | sed -e 's/#DESCRIPTION /#EXTINF:0,/' > $tmpFile1
tail -n +4 "$file" | grep "^#SERVICE" | cut -d ':' -f 11 | sed -e 's/%3a/:/gi' > $tmpFile2
echo "#EXTM3U"
paste -d '\n' $tmpFile1 $tmpFile2
rm $tmpFile1 $tmpFile2