要为文件夹中的所有音乐创建播放列表,我在bash中使用以下命令:
ls > list.txt
我想使用pwd(打印工作目录)命令的结果作为播放列表的名称.
就像是:
ls > ${pwd}.txt
这不起作用 - 任何人都可以告诉我我需要用什么语法来做这样的事情?
编辑:正如评论中所提到的,pwd最终会给出一个绝对路径,所以我的播放列表最终会在某个目录中被命名为.txt - d'oh!所以我必须修剪路径.感谢您发现 - 我可能花了很多年的时间想知道我的文件去了哪里!
最好的方法是"$(command substitution)"
(感谢Landon):
ls > "$(pwd).txt"
您有时也会看到人们使用旧的反引号表示法,但这在嵌套和转义方面有几个缺点:
ls > "`pwd`.txt"
请注意,未处理的替换pwd
是绝对路径,因此上述命令在与工作目录相同的目录中创建一个具有相同名称的文件,但具有.txt
扩展名.Thomas Kammeyer指出该basename
命令剥离了前导目录,因此这将在当前目录中创建一个具有该目录名称的文本文件:
ls > "$(basename "$(pwd)").txt"
还要感谢erichui提出路径中的空间问题.
这相当于反引号解决方案:
ls > $(pwd).txt
要按字面意思做你所说的,你可以尝试:
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"的子目录,例如,在一些备用文件中包含跟踪数据(基本上,我用这种方式"隐藏"元数据).它运作正常,因为我的需求很简单,我的收藏很小.
我怀疑问题可能是其中一个目录名称中有空格.例如,如果您的工作目录是"/ home/user/music/artist name".Bash会因为你想要重定向到/ home/user/music/artist和name.txt而感到困惑.你可以用双引号来解决这个问题
ls > "$(pwd).txt"
此外,您可能不想重定向到$(pwd).txt.在上面的示例中,您将输出重定向到文件"/ home/user/music/artist name.txt"