在bash中使用命令的结果作为参数?

要为一个文件夹中的所有音乐创build播放列表,我在bash中使用以下命令:

ls > list.txt 

我想使用pwd (打印工作目录)命令的结果作为播放列表的名称。

就像是:

 ls > ${pwd}.txt 

这不工作,但有谁能告诉我什么语法我需要用来做这样的事情?

编辑:正如在评论中提到pwd将最终提供一个绝对path,所以我的播放列表将最终被命名为.txt在某个目录中 – 德哦! 所以我必须修剪path。 感谢您发现 – 我可能会花时间想知道我的文件去了哪里!

使用反引号replace命令的结果:

 ls > "`pwd`.txt" 

正如Landon所指出的, $(cmd)是等价的:

 ls > "$(pwd).txt" 

请注意, pwd的未经处理的replace是绝对path,因此上述命令将在工作目录的相同目录中创build一个与该文件同名的文件,但扩展名为.txt 。 Thomas Kammeyer指出, basename命令去掉了前导目录,所以这将在当前目录中创build一个文本文件,其名称为该目录:

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

还要感谢erichui提出的path空间的问题。

要从字面上理解你所说的话,你可以尝试:

 ls > `pwd`.txt 

这将使用完整的path名,这应该是好的。 请注意,如果您在您的主目录(可能位于/ home / hoboben)中执行此操作,您将尝试在上面的目录中创build/home/hoboben.txt文件。

这是你想要的吗?

如果你想让这个目录包含一个以它命名的文件,你可以得到当前目录的基本名称,然后把.txt加到pwd中。

现在,而不是使用pwd命令…为什么不使用PWD环境variables?

例如:

 ls > $PWD.txt 

要么

 ls > ${PWD}.txt 

可能是你想要记住你的第二个例子。

如果您在/ home / hoboben中,并且想要创build/home/hobben/hoboben.txt,请尝试:

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

如果你这样做,这个文件将包含自己的名字,所以大多数情况下,你可以通过几种方法之一来解决这个问题。 只要不使用-a标志(然后可select重命名结果文件),您可以redirect到其他位置并移动文件或将文件命名为以点开头的文件,以便将其从ls命令中隐藏起来。

我编写自己的脚本来pipe理音乐文件的目录层次结构,并使用名为“.info”的子目录,例如,在一些备用文件中包含音轨数据(基本上,我用这种方法“隐藏”元数据)。 它工作得很好,因为我的需求很简单,我的collections很小。

这相当于反解解决scheme:

 ls > $(pwd).txt 

我怀疑问题可能是其中一个目录名称中有空格。 例如,如果你的工作目录是“/ home / user / music / artist name”。 Bash会混淆你以为你试图redirect到/ home / user / music / artist和name.txt。 你可以用双引号解决这个问题

 ls > "$(pwd).txt" 

此外,您可能不希望redirect到$(pwd).txt。 在上面的例子中,你将把输出redirect到文件“/ home / user / music / artist name.txt”

语法是:

 ls > `pwd`.txt 

这就是'〜'下的'''字符,而不是普通的单引号。

使用上述方法将创build当前目录上一级的文件。 如果您希望播放列表全部转到一个目录,您需要执行以下操作:

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

去除除目录名外的所有内容

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

这可能不是你想要的,因为那么你不知道文件在哪里(除非你改变了ls命令)

用“_”replace“/”

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

但是播放列表看上去很难看,甚至可能不适合select窗口

所以这会给你一个简短的可读名字和文件里面的可用path

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