bash에서 명령 결과를 인수로 사용하시겠습니까?
-
09-06-2019 - |
문제
폴더에 있는 모든 음악에 대한 재생 목록을 생성하려면 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