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

ls > list.txt

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

就像是:

ls > ${pwd}.txt

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

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

有帮助吗?

解决方案

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

ls > "$(pwd).txt"

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

ls > "`pwd`.txt"

请注意,未处理的替换 pwd 是绝对路径,因此上面的命令在与工作目录相同的目录中创建一个同名的文件,但带有 .txt 扩大。托马斯·卡迈耶指出 basename 命令删除前导目录,因此这将在当前目录中创建一个具有该目录名称的文本文件:

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

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

其他提示

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

ls > $(pwd).txt

要按照你所说的去做,你可以尝试:

ls > `pwd`.txt

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

这是你想要的吗?

如果您希望该目录包含以其命名的文件,则将获得当前目录的Basename,并将其附加到PWD上。

现在,不要使用 pwd 命令......为什么不使用 PWD 环境变量?

例如:

ls > $PWD.txt

或者

ls > ${PWD}.txt

可能就是您在第二个示例中试图记住的内容。

如果您位于 /home/hoboben 并且想要创建 /home/hoboben/hoboben.txt,请尝试:

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

如果您这样做,该文件将包含自己的名称,因此大多数情况下,您可以通过以下几种方法之一来解决此问题。只要不使用 -a 标志(然后可以选择重命名生成的文件),您就可以重定向到其他位置并移动文件或以点开头命名文件,以将其隐藏在 ls 命令中。

我编写自己的脚本来管理音乐文件的目录层次结构,并使用名为“.info”的子目录,例如,在一些备用文件中包含曲目数据(基本上,我通过这种方式“隐藏”元数据)。效果还不错,因为我的需求很简单,而且我的收藏很少。

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

ls > "$(pwd).txt"

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

语法是:

ls > `pwd`.txt

这是“~”下面的“`”字符,而不是常规的单引号。

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

#!/bin/sh

MYVAR=`pwd | sed "s|/|_|g"`
ls > /playlistdir/$MYVAR-list.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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top