在bash中使用命令的结果作为参数?
要为一个文件夹中的所有音乐创build播放列表,我在bash中使用以下命令:
ls > list.txt
我想使用pwd (打印工作目录)命令的结果作为播放列表的名称。
就像是:
ls > ${pwd}.txt
这不工作,但有谁能告诉我什么语法我需要用来做这样的事情?
编辑:正如在评论中提到pwd将最终提供一个绝对path,所以我的播放列表将最终被命名为.txt在某个目录中 – 德哦! 所以我必须修剪path。 感谢您发现 – 我可能会花时间想知道我的文件去了哪里!
使用反引号replace命令的结果:
ls > "`pwd`.txt"
正如Landon所指出的, $(cmd)
是等价的:
ls > "$(pwd).txt"
请注意, pwd
的未经处理的replace是绝对path,因此上述命令将在工作目录的相同目录中创build一个与该文件同名的文件,但扩展名为.txt
。 Thomas Kammeyer指出, basename
命令去掉了前导目录,所以这将在当前目录中创build一个文本文件,其名称为该目录:
ls > "`basename "$(pwd)"`.txt"
还要感谢erichui提出的path空间的问题。
要从字面上理解你所说的话,你可以尝试:
ls > `pwd`.txt
这将使用完整的path名,这应该是好的。 请注意,如果您在您的主目录(可能位于/ home / hoboben)中执行此操作,您将尝试在上面的目录中创build/home/hoboben.txt文件。
这是你想要的吗?
如果你想让这个目录包含一个以它命名的文件,你可以得到当前目录的基本名称,然后把.txt加到pwd中。
现在,而不是使用pwd命令…为什么不使用PWD环境variables?
例如:
ls > $PWD.txt
要么
ls > ${PWD}.txt
可能是你想要记住你的第二个例子。
如果您在/ home / hoboben中,并且想要创build/home/hobben/hoboben.txt,请尝试:
ls > ${PWD}/${PWD##*/}.txt
如果你这样做,这个文件将包含自己的名字,所以大多数情况下,你可以通过几种方法之一来解决这个问题。 只要不使用-a标志(然后可select重命名结果文件),您可以redirect到其他位置并移动文件或将文件命名为以点开头的文件,以便将其从ls命令中隐藏起来。
我编写自己的脚本来pipe理音乐文件的目录层次结构,并使用名为“.info”的子目录,例如,在一些备用文件中包含音轨数据(基本上,我用这种方法“隐藏”元数据)。 它工作得很好,因为我的需求很简单,我的collections很小。
这相当于反解解决scheme:
ls > $(pwd).txt
我怀疑问题可能是其中一个目录名称中有空格。 例如,如果你的工作目录是“/ home / user / music / artist name”。 Bash会混淆你以为你试图redirect到/ home / user / music / artist和name.txt。 你可以用双引号解决这个问题
ls > "$(pwd).txt"
此外,您可能不希望redirect到$(pwd).txt。 在上面的例子中,你将把输出redirect到文件“/ home / user / music / artist name.txt”
语法是:
ls > `pwd`.txt
这就是'〜'下的'''字符,而不是普通的单引号。
使用上述方法将创build当前目录上一级的文件。 如果您希望播放列表全部转到一个目录,您需要执行以下操作:
#!/bin/sh MYVAR=`pwd | sed "s|/|_|g"` ls > /playlistdir/$MYVAR-list.txt
去除除目录名外的所有内容
ls >/playlistdir/${PWD##/*}.txt
这可能不是你想要的,因为那么你不知道文件在哪里(除非你改变了ls命令)
用“_”replace“/”
ls >/playlistdir/${PWD//\//_}.txt
但是播放列表看上去很难看,甚至可能不适合select窗口
所以这会给你一个简短的可读名字和文件里面的可用path
ext=.mp3 #leave blank for all files for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt