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

时间:2008-09-12 02:38:11

标签: bash command-line

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

ls > list.txt

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

类似的东西:

ls > ${pwd}.txt

虽然这不起作用 - 有人能说出我需要用什么语法来做这样的事情吗?

编辑:正如评论中所提到的,pwd最终会给出一个绝对路径,所以我的播放列表最终会在某个目录中被命名为.txt - d'oh!所以我必须修剪路径。感谢您发现 - 我可能已经花了很长时间想知道我的文件去了哪里!

7 个答案:

答案 0 :(得分:73)

执行此操作的最佳方法是"$(command substitution)"(谢谢,Landon):

ls > "$(pwd).txt"

您有时也会看到人们使用较旧的反引号表示法,但在嵌套和转义方面有several drawbacks

ls > "`pwd`.txt"

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

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

还要感谢erichui提出路径中的空间问题。

答案 1 :(得分: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”的子目录,例如,在一些备用文件中包含轨道数据(基本上,我以这种方式“隐藏”元数据)。它运作正常,因为我的需求很简单,我的收藏很小。

答案 2 :(得分:6)

这相当于反引号解决方案:

ls > $(pwd).txt

答案 3 :(得分: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 :(得分:4)

语法为:

ls > `pwd`.txt

这是'〜'下面的'''字符,而不是常规的单引号。

答案 5 :(得分:1)

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

#!/bin/sh

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

答案 6 :(得分: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