![将完整的文件路径信息传递给 xargs](https://linux22.com/image/10854/%E5%B0%86%E5%AE%8C%E6%95%B4%E7%9A%84%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84%E4%BF%A1%E6%81%AF%E4%BC%A0%E9%80%92%E7%BB%99%20xargs.png)
我有一个 bash 脚本,其中我尝试按修改日期的顺序列出 jpg 文件,然后使用 xargs 按数字顺序(0.jpg、1.jpg、2.jpg 等)重命名它们。这需要在多个目录中发生。这是代码:
ls -1rt "/media/171/" | xargs rename 's/^[^\.]*(\..*)?$/our $i; sprintf("%01d$1", $i++)/e'
ls -1rt "/media/193/" | xargs rename 's/^[^\.]*(\..*)?$/our $i; sprintf("%01d$1", $i++)/e'
ls -1rt "/media/211/" | xargs rename 's/^[^\.]*(\..*)?$/our $i; sprintf("%01d$1", $i++)/e'
问题是,当我执行脚本时,文件列出正常,但 xargs 抛出错误,找不到指定的文件。仅当我从每个目录中运行命令时它才有效。我意识到你不能在 bash 脚本中“cd /”,问题似乎是 xargs 没有传递完整的文件路径。如何将完整文件路径传递给 xargs 命令?
答案1
在这种情况下,有关文件可能抛出的唯一错误xargs
是它找不到可执行文件。rename
有关文件的其他所有内容都必须来自xargs
运行的程序。
shell 脚本可以使用该cd
命令。但在这种情况下,脚本无法知道它应该使用哪个目录。
你可能想尝试
( cd "/media/171/" && ls -1rt | xargs rename 's/^[^\.]*(\..*)?$/our $i; sprintf("%01d$1", $i++)/e' )