문제

폴더에 있는 모든 음악에 대한 재생 목록을 생성하려면 bash에서 다음 명령을 사용합니다.

ls > list.txt

나는 그 결과를 사용하고 싶다. 비밀번호 (작업 디렉토리 인쇄) 재생 목록 이름에 대한 명령입니다.

다음과 같은 것 :

ls > ${pwd}.txt

그래도 작동하지 않습니다. 이와 같은 작업을 수행하는 데 어떤 구문을 사용해야 하는지 말해 줄 수 있는 사람이 있나요?

편집하다: 댓글에서 언급했듯이 pwd는 절대 경로를 제공하므로 내 재생 목록은 일부 디렉터리에서 .txt라는 이름으로 지정됩니다. d'oh!그래서 길을 다듬어야 해요.찾아주셔서 감사합니다. 아마도 내 파일이 어디로 갔는지 궁금해서 시간을 보냈을 것입니다!

도움이 되었습니까?

해결책

이를 수행하는 가장 좋은 방법은 "$(command substitution)" (감사해요, 랜던):

ls > "$(pwd).txt"

때때로 사람들이 오래된 백틱 표기법을 사용하는 것을 볼 수도 있지만 이는 여러 가지 단점 중첩 및 이스케이프 측면에서:

ls > "`pwd`.txt"

처리되지 않은 대체는 다음과 같습니다. pwd 은 절대 경로이므로 위 명령은 작업 디렉토리와 동일한 디렉토리에 동일한 이름의 파일을 생성하지만 .txt 확대.Thomas Kammeyer는 다음과 같이 지적했습니다. basename 명령은 선행 디렉터리를 제거하므로 현재 디렉터리에 해당 디렉터리 이름의 텍스트 파일이 생성됩니다.

ls > "$(basename "$(pwd)").txt"

또한 경로의 공백 문제를 제기한 erichui에게도 감사드립니다.

다른 팁

이는 백틱 솔루션과 동일합니다.

ls > $(pwd).txt

말씀하신 내용을 문자 그대로 실행하려면 다음을 시도해 보세요.

ls > `pwd`.txt

전체 경로 이름을 사용하므로 괜찮습니다./home /hoboben에있을 수있는 홈 디렉토리 에서이 작업을 수행하면 위의 디렉토리의 텍스트 파일 인 /home/hoboben.txt 만들기를 시도합니다.

이것이 당신이 원했던 것입니까?

디렉토리에 이름을 따서 명명 된 파일을 포함하려면 현재 디렉토리의베이스 이름을 얻고 .txt에 PWD에 추가 할 수 있습니다.

이제 pwd 명령을 사용하는 대신...PWD 환경 변수를 사용하지 않는 이유는 무엇입니까?

예를 들어:

ls > $PWD.txt

또는

ls > ${PWD}.txt

아마도 두 번째 예를 통해 기억하려고 했던 내용일 것입니다.

/home/hoboben에 있고 /home/hoboben/hoboben.txt를 생성하려면 다음을 시도하십시오.

ls > ${PWD}/${PWD##*/}.txt

이렇게 하면 파일에 자체 이름이 포함되므로 대부분의 경우 몇 가지 방법 중 하나로 이 문제를 해결할 수 있습니다.-a 플래그를 사용하지 않는 한(그리고 선택적으로 결과 파일의 이름을 바꾸지 않는 한) 다른 곳으로 리디렉션하고 파일을 이동하거나 점으로 시작하는 파일 이름을 지정하여 ls 명령에서 숨길 수 있습니다.

나는 음악 파일의 디렉터리 계층 구조를 관리하기 위해 나만의 스크립트를 작성하고 ".info"라는 하위 디렉터리를 사용하여 일부 예비 파일에 트랙 데이터를 포함합니다(기본적으로 이 방법으로 메타데이터를 "숨깁니다").내 요구 사항이 간단하고 내 컬렉션이 작기 때문에 괜찮습니다.

디렉토리 이름 중 하나에 공백이 있는 것이 문제일 수 있다고 생각됩니다.예를 들어 작업 디렉터리가 "/home/user/music/artist name"인 경우입니다.Bash는 /home/user/music/artist 및 name.txt로 리디렉션하려고 한다고 생각하여 혼란스러울 것입니다.큰따옴표로 이 문제를 해결할 수 있습니다.

ls > "$(pwd).txt"

또한 $(pwd).txt로 리디렉션하고 싶지 않을 수도 있습니다.위의 예에서는 출력을 "/home/user/music/artist name.txt" 파일로 리디렉션합니다.

구문은 다음과 같습니다.

ls > `pwd`.txt

이는 일반 작은따옴표가 아니라 '~' 아래에 있는 '`' 문자입니다.

위의 방법을 사용하면 현재 디렉터리보다 한 수준 위에 파일이 생성됩니다.재생 목록을 모두 하나의 디렉토리로 이동하려면 다음과 같이 해야 합니다.

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt

디렉토리 이름을 제외한 모든 것을 제거하려면

ls >/playlistdir/${PWD##/*}.txt

이것은 아마도 당신이 원하는 것이 아닐 것입니다. 왜냐하면 파일이 어디에 있는지 모르기 때문입니다(ls 명령을 변경하지 않는 한).

"/"를 "_"로 바꾸려면

ls >/playlistdir/${PWD//\//_}.txt

하지만 그러면 재생 목록이 보기 흉해 보이고 선택 창에 맞지 ​​않을 수도 있습니다.

따라서 이것은 읽을 수 있는 짧은 이름과 파일 내에서 사용 가능한 경로를 모두 제공합니다.

ext=.mp3 #leave blank for all files
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top