【问题标题】:Pipe xargs to sed and mv command管道 xargs 到 sed 和 mv 命令
【发布时间】:2019-12-13 08:38:42
【问题描述】:

我必须对文件执行一些复杂的正则表达式,然后移动文件。 我正在考虑 xargs,因为它看起来非常适合这项工作。

find . -name "*.txt" -print0 | sed 's/[[complex-regex]]//g' | xargs -0 -I file mv file output-of-sed

我已经用谷歌搜索了好几个小时,但我一直不明白的语法是如何将 sed 的输出作为上面 mv 命令的第二个参数。

我完全一无所知,但被 xargs 的魔力迷住了,这可能是我想要做的吗?

【问题讨论】:

  • sed 命令的输出是什么样的?每行是否包含原始名称和“修改后的”名称(名称由空格分隔,旧名称在新名称之前)?是否总是保证名称不同?是否有任何名称中包含空格、换行符或其他令人讨厌的字符?假设您每行生成“旧新”,并且文件名中没有空格,您可能可以使用xargs 每行工作。即使这样也不能保证。顺便说一句,您的sed 命令可能应该知道空分隔符。
  • 嗨,乔纳森,sed 命令的输出与输入文件非常不同,例如它删除了多个空格并用单个下划线替换它们
  • 好吧,但是……好吧,多个空格位让生活变得可怕。无论如何,如果你要手动移动文件,你会使用mv old-name new-name。如果您从未将old-name 传递给xargs,那么xargs 执行的mv 命令如何知道旧名称是什么?那么您使用空格的事实意味着您需要告诉sed 使用以空结尾的行,并且您必须打印旧名称,然后将其弄乱并打印新行,并且然后告诉xargs 使用成对的连续名称。但是你得到的答案几乎就是你所需要的。

标签: shell xargs


【解决方案1】:

当需要复杂的正则表达式来重命名或移动目录或文件时, 是要走的路:

find . -name "*.txt" -print0 -exec rename -0 's@[[complex-regex]]@@' {} \;

还有其他同名的工具可能会也可能不会做到这一点,所以要小心。

util-linux 包中的重命名命令不会。

如果你运行以下命令 (GNU)

$ file "$(readlink -f "$(type -p rename)")"

而您的结果包含 Perl script, ASCII text executable 而不包含 ELF,那么这似乎是正确的工具 =)

如果不是,则将其设为 Debian 和派生类 Ubuntu 的默认值(通常已经如此):

$ sudo update-alternatives --set rename /path/to/rename

/path/to/rename 替换为您的perl rename 可执行文件的路径。


如果你没有这个命令,搜索你的包管理器来安装它或do it manually(没有deps...)


这个工具最初是由 Perl 的父亲 Larry Wall 编写的。

【讨论】:

  • 嗨 Giles 感谢您暂停并查看此内容我很抱歉我应该提到我没有此框上的重命名实用程序,因为我不拥有该框
  • 正如解释的那样,它只是一个可下载的脚本,没有依赖项(只需要 Perl)
  • 嗨,Giles,我完全理解我会尝试哄管理员,但这是服务器,我担心如果系统管理员允许我的谦虚请求,他们可能会:)
  • 您甚至可以将此脚本作为简单用户并将其放入 PATH 变量中
  • 或者简单地说:wget https://metacpan.org/module/RMBARKER/File-Rename-0.20/rename.PL; chmod +x rename.PL; ./rename.PL
猜你喜欢
  • 2016-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-05
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
相关资源
最近更新 更多