通过 xargs 到 `tag` 命令行工具的管道路径

Posted

技术标签:

【中文标题】通过 xargs 到 `tag` 命令行工具的管道路径【英文标题】:piping paths via xargs to `tag` command line tool 【发布时间】:2021-01-06 09:56:13 【问题描述】:

tag 是一个命令行可执行文件,它允许 macOS 用户向文件添加“标签”。

tag -a | --add <tags> <path>... Add tags to file

我正在尝试通过管道传输文本文档中的文件列表,但经过几天的失败后,我非常需要语法方面的帮助。描述页面上的唯一线索是:

如果您打算通过 xargs 管道输出标记,您可能需要 使用每个选项的 -0 选项。

我尝试了几十个命令:xargs、gnu-xargs、for、while,但无法将标签添加到列表中的文件。研究网络,我认为可能是行尾有问题。

我安装了dos2unix 并在文件上运行它以修复可能的行结束问题,但这似乎没有解决任何问题。

如果您 cd 进入您尝试标记的文件目录,则不必使用文件的完整路径。

$ gxargs -0 -t --arg-file="/Users/john/Desktop/diffremove.txt" | tag -0 -a red

echo '13.Hours.The.Secret.Soldiers.of.Benghazi.2016.1080p.BluRay.x265'$'\n''1941.1979.DC.1080p.BluRay.x265'$'\n'...

不明白 xargs 如何传递我认为需要在查找文件 tag -0 -a red <variable here> 的命令之后放置变量的行

我试过了: $ for i in $(/Users/john/Desktop/diffremove.txt) do `tag -a red "$1"`

我安装了gnu xargs 并尝试了这个命令。

$ </Users/john/Desktop/diffremove.txt gxargs -0 sh -c 'for arg do tag -0 -a red "$arg"'

编辑: 尝试此命令不会导致错误,但文件不会被标记。

$ </Users/john/Desktop/diffremove.txt xargs -0 sh -c 'for arg do `tag -0 -a red '$arg'`;done'

【问题讨论】:

【参考方案1】:

试试这个

xargs -d '\n' -a /Users/john/Desktop/diffremove.txt -I % tag -a red %

这里我们使用 xargs 从文件中读取(使用 -a),使用替换字符串(使用 %)并执行命令 tag -a red filename。您可能需要添加 -d '\n'(将分隔符设置为换行符)来拆分字符串。

但是,读取和处理文件中的行的经典方法是使用 shell 内置命令 read

$ while IFS= read -r p; do tag -a red $p; done < /Users/john/Desktop/diffremove.txt

,如果文件中没有空格,则可以跳过 IFS= 部分。

【讨论】:

这是 gnu xargs? 问题似乎是文件名正在变成一个长字符串,而不是换行符。 是的,gnu.org/software/findutils/manual/html_node/find_html/…,你需要哪一个? 我在mac上但是已经安装了gnu xargs。 hm,尝试在 xargs 中添加 -d '\n' 选项

以上是关于通过 xargs 到 `tag` 命令行工具的管道路径的主要内容,如果未能解决你的问题,请参考以下文章

xargs命令详解,xargs与管道的区别

xargs命令

xargs命令

xargs命令用法

Linux命令-xargs

Linux-xargs命令