将命令的输出通过管道传递给 rm 命令

将命令的输出通过管道传递给 rm 命令

以下命令打印正在播放的歌曲的路径。

mpc | head -n 1 
songs/oldSongs/Mukesh_D/041 KANHAIYA = YAAD AAYI ADHI RAAT KO.mp3

我可以通过修改打印该文件的命令来删除该文件吗?

答案1

为了回答您更普遍的问题,需要xargs获取标准输入上的单词列表并将其转换为命令的参数列表。

但是,xargs期望列表作为空格、制表符和换行符(可能还有更多空白字符,具体取决于区域设置和 xargs 实现)分隔的单词列表,其中使用单引号、双引号和反斜杠来转义这些分隔符(在以下方面具有不同的行为)通过 xargs 的不同实现来嵌套)。

如果输入是换行符终止列表,则规范方式将其转换为 xargs 期望的格式就是转义每个字符(尽管只需要反斜杠、单引号、双引号、下划线(可能)、空格和制表符(如果不在 C 语言环境中,则可能还需要其他空格))但是带有反斜杠字符的换行符,我们可以使用sed.

mpc | head -n 1 | sed 's/./\\&/g' | xargs rm --

请注意,某些xargs实现对标准输入上期望的最大行长度有相当低的限制,因此您可能只想用这些字符转义必要的字符。

至少对于 GNU xargs,你不需要这样做,你可以这样做:

mpc | head -n 1 | xargs -rd '\n' rm --

(还使用 GNU 特定的 -r 选项来避免在输入为空时运行任何命令)。

答案2

您可以使用 来执行此操作rm -i "/path/to/music/library/$(mpc -f %file% | head -n 1)"。但是,请注意,如果文件名包含换行符,这将会中断。由于 的输出mpc -f %file%与您的音乐库路径相关,因此您需要将其添加到输出之前。

答案3

就我个人而言,虽然我认为 xargs 很有趣,但我更喜欢循环这种事情。为什么?嗯,它为您提供了更大的灵活性......并且还为您提供了一种相当简单的处理空间的方法:

mpc | head -n 1 | while read filename
do
  ls -al "$filename"  # Look at the file you're deleting
  rm -i "$filename"   # Ask if you want it deleted (or not)
done

当您使用这样的 while 循环时,您的数据将被注入“read”之后的任何变量名称中;为了引用该变量,您需要前导美元符号。引号是为了优雅地处理空格,因此它们看起来不像分隔符。像这样的循环虽然不如简单的单线优雅,但为您提供了更大的灵活性,从长远来看,它会非常方便。

答案4

如果可以安全地假设您没有带双引号或换行符的文件,您可以执行以下操作:

mpc | head -n 1 | sed  's/^/"/g ; s/$/"/g' | xargs rm --

sed 在文件名周围添加引号,xargs 将其获取的输入转换为其正在运行的命令(在本例中为 rm 命令)的参数。

相关内容