2008-09-12 93 views
44

要创建的所有文件夹中的音乐的播放列表,我在bash使用下面的命令:在bash中使用命令的结果作为参数?

ls > list.txt 

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

喜欢的东西:

ls > ${pwd}.txt 

这并不工作,虽然 - 谁能告诉我,我需要使用做这样的事情是什么语法?

编辑:正如评论PWD最终会给出一个绝对路径提到,所以我的播放列表最终会在某个目录被命名.TXT - 德哦!所以我必须修剪路径。感谢您发现 - 我可能会花时间想知道我的文件在哪里!

回答

56

使用反引号来替换结果的命令:

ls > "`pwd`.txt" 

正如兰登指出,$(cmd)是等效的:

ls > "$(pwd).txt" 

注意的pwd未处理取代是绝对路径,所以上面的命令会在工作目录所在的同一目录下创建一个名称相同的文件,但是扩展名为.txt。托马斯Kammeyer指出,basename命令去掉领先的目录,因此这将创建在当前目录下的文本文件与目录的名称:

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

也感谢erichui在造就了空间问题路径。

+0

内,但请注意,使用反引号或$()仍然会fork另一个shell .. 。使用环境变量是成本最低的方法。 – 2008-09-12 03:02:55

4

的语法是:

ls > `pwd`.txt 

这是“'”字了“〜”,而不是常规的单引号下方。

6

要做到从字面上你说的话,你可以尝试:

ls > `pwd`.txt 

将使用的完整路径,这应该是罚款。 请注意,如果您在您的主目录中执行此操作,可能在 处于/ home/hoboben中,您将尝试在上面的目录中创建/home/hoboben.txt, 文本文件。

这是你想要的吗?

如果您希望该目录包含一个以该文件命名的文件,您将获得当前目录的基本名称 ,并将其附加到.wxt的pwd中。

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

例如:

ls > $PWD.txt 

ls > ${PWD}.txt 

也许正是你想用你的第二个例子记住。

如果你在/ home/hoboben和你想创建/home/hoboben/hoboben.txt,尝试:

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

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

我编写自己的脚本来管理音乐文件的目录层次结构,例如,我使用名为“.info”的子目录在一些备用文件中包含音轨数据(基本上,我用这种方法“隐藏”元数据)。它工作得很好,因为我的需求很简单,我的收藏很小。

1

使用上述方法将创建当前目录上一级的文件。如果你想在播放列表都去到一个目录你需要做这样的事情:

#!/bin/sh 

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

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

ls > $(pwd).txt 
5

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

ls > "$(pwd).txt" 

此外,您可能不希望重定向到$(pwd).txt。在上面的例子中,你会被重定向输出到文件“/ home/user中/音乐/艺术家name.txt”

0

剥夺所有,但目录名

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

这可能不是什么你想,因为你不知道在哪里的文件(除非你改变了ls命令)

取代“/”与“_”

ls >/playlistdir/${PWD//\//_}.txt 

但随后的播放列表看起来丑陋和MAYB Ë甚至不适合在选择窗口

所以这会给你只有很短可读的名称以及可用的路径,文件

ext=.mp3 #leave blank for all files 
for FILE in "$PWD/*$ext"; do echo "$FILE";done >/playlistdir/${PWD##/*}.txt