결국 dynamic output
터미널의 (설명하겠습니다) 내용을 텍스트 파일로 저장할 수 있게 되지만, 이것이 제가 궁극적으로 찾고 있는 것입니다.
나는 이라는 터미널용 사용자 정의 명령을 만들었습니다 playRandom
. 이 명령은 임의의 노래를 영원히 재생하는 것입니다. 이를 위해 내가 만든 bash 파일은 다음과 같습니다.
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
참고: play
명령의 출처는 다음과 같습니다.SoX소프트웨어.
이제 출력은 다음과 같습니다.
보시다시피 출력이 변경되므로 출력을 저장하는 데 dynamically
사용할 수 없습니다 .>>
'재생되는 노래 이름'을 텍스트 파일로 저장할 수 있게 하고 싶습니다.
이 목표를 어떻게 달성할 수 있나요? 미리 감사드립니다.
답변1
현재 재생 중인 파일명 저장하기
단일 파일을 재생한 후 명령이 종료되기 때문에 우리가 할 수 있는 일은 파일 배치를 사용 하고 제공하는 play
대신 각 파일을 한 번에 하나씩 꺼내서 파일에 에코하고 나중에 파일을 재생하는 것입니다. 편집된 스크립트는 아래와 같습니다. 안전한 방식으로 파일 이름을 처리하기 위해 여기에 추가 옵션과 명령이 추가되었습니다 .xargs
play
IFS= read -d'' -r
#!/bin/bash
# create file for playing songs first
echo > playlist.txt
# Now play each song and echo filename to file
find ./ -type f -print0 | sort -z -R | while IFS= read -d '' -r filename
do
clear
echo "$filename" >> playlist.txt
play "$filename"
done
이 접근 방식의 장점은 파일 이름이 재생될 때 재생 목록.txt에 저장된다는 것입니다. 이를 통해 tail -F playlist.txt
.
메모: 님의 출력 변경 명령 playlist.txt
에 다음과 같이 나열되는 것을 방지하려면 :find
find
find ./ -type f -not -name "playlist.txt" -print0
또한 파일만 나열되도록 하려면 .mp3
다음을 수행할 수 있습니다.
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
재생을 위해 발견된 파일 목록 저장
우리의 목표가 파일 목록을 안전하게 보호하는 것이라면~ 전에재생되지만 과학적인 내용은 많지 않습니다. 찾기-정렬 파이프라인을 먼저 파일에 기록한 다음 해당 파일을 구조 play
를 통해 xargs
또는 구조를 통해 다시 공급할 수 있습니다.while IFS= read -r ; do ... done
#!/bin/bash
find ./ -type f -print0 | sort -z -R > playlist.txt
while IFS= read -d '' -r filename
do
clear
play "$filename"
done < playlist.txt
답변2
find ./ -type f | sort -R | tee text.file | xargs -I + play +
또한 참조하십시오 man tee
.
답변3
내 해결책은 다음과 같습니다.
1. 실시간(현재 재생 중)
명령 을 실행한 후 play
다음을 사용하십시오.
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
현재 재생 중인 노래의 이름을 반환하며 를 사용하여 파일로 리디렉션할 수 있습니다 >
.
1.1. 노트
/proc/`pidof play`/fd/3
- 현재 재생 중인 트랙(파일)에 대한 파일 설명자입니다.
- 사용하여
readlink
파일 이름을 얻습니다. - 이를 사용하여
soxi
정보를 얻습니다. - 을 사용하여
grep
트랙 제목을 잘라냅니다.
2. 플레이하기 전 (모든 이름을 나열하세요)
find ./ -type f | sort -R | tee /tmp/play-files | xargs -I + soxi "+"\
| grep -Po "(?<=Title=).*" > list_of_names && xargs < /tmp/play-files\
-I + play "+"
list_of_names
모든 트랙 이름을 포함하는 현재 디렉토리에 이름이 지정된 파일이 생성됩니다 .