73

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

ls > list.txt

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

就像是:

ls > ${pwd}.txt

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

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

4

7 回答 7

88

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

ls > "$(pwd).txt"

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

ls > "`pwd`.txt"

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

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

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

于 2008-09-12T02:42:06.047 回答
7

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

ls > $(pwd).txt
于 2008-09-12T02:57:52.420 回答
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”的子目录,例如,在一些备用文件中包含曲目数据(基本上,我以这种方式“隐藏”元数据)。效果很好,因为我的需求很简单,而且我的收藏很小。

于 2008-09-12T02:53:16.910 回答
5

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

ls > "$(pwd).txt"

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

于 2008-09-12T02:59:47.720 回答
4

语法是:

ls > `pwd`.txt

那是 '~' 下面的 '`' 字符,而不是常规的单引号。

于 2008-09-12T02:42:57.590 回答
2

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

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.txt
于 2008-09-12T02:53:57.717 回答
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
于 2012-03-06T18:29:57.587 回答