2008-09-12 104 views
44

要創建的所有文件夾中的音樂的播放列表,我在bash使用下面的命令:在bash中使用命令的結果作爲參數?

ls > list.txt 

我想用PWD(打印工作目錄)的結果命令播放列表的名稱。

喜歡的東西:

ls > ${pwd}.txt 

這並不工作,雖然 - 誰能告訴我,我需要使用做這樣的事情是什麼語法?

編輯:正如評論PWD最終會給出一個絕對路徑提到,所以我的播放列表最終會在某個目錄被命名.TXT - 德哦!所以我必須修剪路徑。感謝您發現 - 我可能會花時間想知道我的文件在哪裏!

回答

56

使用反引號來替換結果的命令:

ls > "`pwd`.txt" 

正如蘭登指出,$(cmd)是等效的:

ls > "$(pwd).txt" 

注意的pwd未處理取代是絕對路徑,所以上面的命令會在工作目錄所在的同一目錄下創建一個名稱相同的文件,但是擴展名爲.txt。托馬斯Kammeyer指出,basename命令去掉領先的目錄,因此這將創建在當前目錄下的文本文件與目錄的名稱:

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

也感謝erichui在造就了空間問題路徑。

+0

內,但請注意,使用反引號或$()仍然會fork另一個shell .. 。使用環境變量是成本最低的方法。 – 2008-09-12 03:02:55

4

的語法是:

ls > `pwd`.txt 

這是「'」字了「〜」,而不是常規的單引號下方。

6

要做到從字面上你說的話,你可以嘗試:

ls > `pwd`.txt 

將使用的完整路徑,這應該是罰款。 請注意,如果您在您的主目錄中執行此操作,可能在 處於/ home/hoboben中,您將嘗試在上面的目錄中創建/home/hoboben.txt, 文本文件。

這是你想要的嗎?

如果您希望該目錄包含一個以該文件命名的文件,您將獲得當前目錄的基本名稱 ,並將其附加到.wxt的pwd中。

現在,而不是使用pwd命令...爲什麼不使用PWD環境變量?

例如:

ls > $PWD.txt 

ls > ${PWD}.txt 

也許正是你想用你的第二個例子記住。

如果你在/ home/hoboben和你想創建/home/hoboben/hoboben.txt,嘗試:

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

如果你這樣做,該文件將包含自己的名字,所以大多數情況下,您可以通過幾種方法之一來解決此問題。只要不使用-a標誌(然後可選擇重命名結果文件),您可以重定向到其他位置並移動文件或將文件命名爲以點開頭的文件,以將其隱藏在ls命令中。

我編寫自己的腳本來管理音樂文件的目錄層次結構,例如,我使用名爲「.info」的子目錄在一些備用文件中包含音軌數據(基本上,我用這種方法「隱藏」元數據)。它工作得很好,因爲我的需求很簡單,我的收藏很小。

1

使用上述方法將創建當前目錄上一級的文件。如果你想在播放列表都去到一個目錄你需要做這樣的事情:

#!/bin/sh 

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

這等同於反引號解決方案:

ls > $(pwd).txt 
5

我懷疑問題可能是其中一個目錄名稱中有空格。例如,如果您的工作目錄是「/ home/user/music/artist name」。 Bash會因爲想重定向到/ home/user/music/artist和name.txt而感到困惑。您可以使用雙引號解決此問題

ls > "$(pwd).txt" 

此外,您可能不希望重定向到$(pwd).txt。在上面的例子中,你會被重定向輸出到文件「/ home/user中/音樂/藝術家name.txt」

0

剝奪所有,但目錄名

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

這可能不是什麼你想,因爲你不知道在哪裏的文件(除非你改變了ls命令)

取代「/」與「_」

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

但隨後的播放列表看起來醜陋和MAYB Ë甚至不適合在選擇窗口

所以這會給你只有很短可讀的名稱以及可用的路徑,文件

ext=.mp3 #leave blank for all files 
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt