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

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

ls > list.txt

我想使用 pwd命令的结果作为播放列表的名称。

比如:

ls > ${pwd}.txt

但是这不起作用-有人能告诉我,我需要使用什么语法来做这样的事情吗?

编辑: 正如在评论中提到的,pwd 将最终给出一个绝对路径,因此我的播放列表将最终被命名。在某个目录中的 txt-d’oh!所以我得修剪一下路径。谢谢你发现这一点-我可能已经花了很长时间想知道我的文件去了哪里!

64539 次浏览

最好的方法是使用 "$(command substitution)"(谢谢,兰登) :

ls > "$(pwd).txt"

您有时也会看到人们使用较老的反勾符号,但是这个符号在嵌套和转义方面有 有几个缺点:

ls > "`pwd`.txt"

请注意,未处理的 pwd替换是一个绝对路径,因此上面的命令将创建一个文件,该文件与工作目录在同一目录中具有相同的名称,但扩展名为 .txt。Thomas Kammeyer 指出,basename命令去掉了前导目录,因此这会在工作目录中创建一个文本文件,其名称为:

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

也感谢二水提出了道路中的空间问题。

语法是:

ls > `pwd`.txt

这是“ ~”下面的“”字符,而不是普通的单引号。

照你说的去做,你可以试试:

ls > `pwd`.txt

它将使用完整的路径名,这应该没问题。 请注意,如果在您的主目录中执行此操作,则 在/home/hoboben 中,您将尝试 create/home/hoboben.txt, 上面目录中的文本文件。

这就是你想要的吗?

如果您希望目录包含以它命名的文件,那么您将获得 工作目录的基本名称,并将其与. txt 附加到 pwd。

现在,与其使用 PWD 命令... 为什么不使用 PWd 环境变量?

例如:

ls > $PWD.txt

或者

ls > ${PWD}.txt

这可能就是你在第二个例子中想要记住的。

如果你在/home/hoboben 并且你想创建/home/hoboben/hoboben.txt,试试:

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

如果这样做,文件将包含它自己的名称,因此通常情况下,可以通过以下几种方式之一进行补救。您可以重定向到其他地方,移动文件或以点开头的文件名,以便在 ls 命令中隐藏它,只要您不使用-a 标志(然后可选地重命名生成的文件)。

我编写自己的脚本来管理音乐文件的目录层次结构,并使用名为“。例如,在一些空闲文件中包含跟踪数据(基本上,我是这样“隐藏”元数据的)。因为我的需求很简单,而且我的收藏很少。

使用上述方法将创建比你的工作目录高一级的文件。如果你想让播放列表全部到一个目录下,你需要这样做:

#!/bin/sh


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

这相当于反向标记解决方案:

ls > $(pwd).txt

我怀疑问题可能是其中一个目录名中有空格。例如,如果你的工作目录是“/home/user/music/art name”。如果您试图重定向到/home/user/music/art 和 name.txt,Bash 会感到困惑。您可以用双引号修复这个问题

ls > "$(pwd).txt"

另外,您可能不希望重定向到 $(pwd)。短信。在上面的示例中,您将输出重定向到文件“/home/user/music/art name.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