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


68

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

ls > list.txt

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

就像是:

ls > ${pwd}.txt

但这不起作用-谁能告诉我我需要使用什么语法来执行类似的操作?

编辑:如评论中所述,pwd将最终给出绝对路径,因此我的播放列表将最终在某些目录中被命名为.txt-d'哦!所以我必须修剪路径。感谢您发现-我可能花了很长时间才想知道我的文件在哪里!

Answers:


82

最好的方法是使用"$(command substitution)"(感谢Landon):

ls > "$(pwd).txt"

有时您还会看到人们使用较旧的反引号表示法,但这在嵌套和转义方面有一些缺点

ls > "`pwd`.txt"

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

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

也感谢erichui提出了路径中的空间问题。


但是请注意,使用反引号或$()仍会派生另一个shell ...使用环境变量是成本最低的方法。
Thomas Kammeyer

是的,但是问题标题和标签是通用的,因此答案也可以通用。在这种情况下,环境变量是“更好”的选项,但这不是对该问题的一般答案。
John Calsbeek

7

这等效于反引号解决方案:

ls > $(pwd).txt

6

按照字面意思做,您可以尝试:

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”的子目录来将曲目数据包含在一些备用文件中(基本上,我是通过这种方式“隐藏”元数据)。可以,因为我的需求很简单,而且我的收藏很小。


5

我怀疑问题可能是目录名称之一中存在空格。例如,如果您的工作目录是“ / home / user / music / artist name”。Bash会以为您要重定向到/ home / user / music / artist和name.txt会感到困惑。您可以使用双引号解决此问题

ls > "$(pwd).txt"

另外,您可能不想重定向到$(pwd).txt。在上面的示例中,您将把输出重定向到文件“ / home / user / music / artist name.txt”


4

语法为:

ls > `pwd`.txt

那是“〜”下方的“`”字符,而不是常规的单引号。


在“〜”下方?这不取决于使用的键盘布局吗?
stack_lech

1

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

#!/bin/sh

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

0

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

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.