터미널의 동적 출력을 텍스트 파일에 쓰기

터미널의 동적 출력을 텍스트 파일에 쓰기

결국 dynamic output터미널의 (설명하겠습니다) 내용을 텍스트 파일로 저장할 수 있게 되지만, 이것이 제가 궁극적으로 찾고 있는 것입니다.

나는 이라는 터미널용 사용자 정의 명령을 만들었습니다 playRandom. 이 명령은 임의의 노래를 영원히 재생하는 것입니다. 이를 위해 내가 만든 bash 파일은 다음과 같습니다.

#!/bin/bash 
find ./ -type f | sort -R | xargs -I + play +

참고: play명령의 출처는 다음과 같습니다.SoX소프트웨어.

이제 출력은 다음과 같습니다.

playRandom 명령

보시다시피 출력이 변경되므로 출력을 저장하는 데 dynamically사용할 수 없습니다 .>>

'재생되는 노래 이름'을 텍스트 파일로 저장할 수 있게 하고 싶습니다.

이 목표를 어떻게 달성할 수 있나요? 미리 감사드립니다.

답변1

현재 재생 중인 파일명 저장하기

단일 파일을 재생한 후 명령이 종료되기 때문에 우리가 할 수 있는 일은 파일 배치를 사용 하고 제공하는 play대신 각 파일을 한 번에 하나씩 꺼내서 파일에 에코하고 나중에 파일을 재생하는 것입니다. 편집된 스크립트는 아래와 같습니다. 안전한 방식으로 파일 이름을 처리하기 위해 여기에 추가 옵션과 명령이 추가되었습니다 .xargsplayIFS= 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에 다음과 같이 나열되는 것을 방지하려면 :findfind

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모든 트랙 이름을 포함하는 현재 디렉토리에 이름이 지정된 파일이 생성됩니다 .

관련 정보