【问题标题】:Single line bash command to rename all files with name A to name B单行 bash 命令将所有名称为 A 的文件重命名为名称 B
【发布时间】:2021-02-17 12:07:10
【问题描述】:

给定文件和文件夹结构:

test
├── a
│   └── hans.x
├── b
│   └── hans.x
└── c
    └── hans.x

我想使用单行 bash 命令将所有文件“hans.x”重命名为“peter.x”。

期望的结果:

test
├── a
│   └── peter.x
├── b
│   └── peter.x
└── c
    └── peter.x

我查看了很多关于 SO 的解决方案,发现很多解决方案展示了如何将文件“peter.x”重命名为“peter.x_somethingmore”,但从未出现上述情况。

我尝试了以下方法:

find . -type f -name 'hans.x' -print0 | xargs --null -I{} mv {} "$(dirname "{}")"peter.x

但不幸的是,这会导致以下执行:

mv ./test/a/hans.x .peter.x
mv ./test/c/hans.x .peter.x
mv ./test/b/hans.x .peter.x

【问题讨论】:

  • 您是否考虑过使用脚本(例如 python)来完成这项任务? Bash 的语法很粗糙
  • @anon01 考虑过python,但我更喜欢使用内置的bash命令来完成这样一个简单的任务,而不是编写脚本。

标签: bash rename subdirectory


【解决方案1】:

使用 GNU find,您可以使用 -execdir

find -type f -name 'hans.x' -execdir mv {} peter.x \;

【讨论】:

  • 这对我来说会导致以下输出:相对路径“~/bin”包含在 PATH 环境变量中,与 find 的 -execdir 操作结合使用是不安全的。请从 $PATH 中删除该条目
  • @avgJoe 这很奇怪,您的PATH 中有硬编码的~ 吗?
  • 我的路径中有 '~/bin'
  • @avgJoe 无论您在哪里设置PATH~/.bash_profile~/.bashrc 或类似名称),都不会引用波浪号。如果被引用,它将按字面意思添加到您的PATH(并导致您看到的消息);不加引号时,它会扩展为 $HOME/bin 的绝对路径,您不会看到该错误消息。
【解决方案2】:

$(...) 在执行 xargs 之前展开。您想在解析行时创建的子shell中运行它:

   ... | xargs -0n1 sh -c 'mv "$1" "$(dirname "$1")"/hans.y' _

【讨论】:

  • 这几乎就像我的'dirname'命令没有正确执行:我试过用echo替换mv。查找 -type f -name 'hans.x' -print0 | xargs -0n1 sh -c 'echo ""$1" "$(dirname "$1")"/hans.y"' 输出如下: ./hans.y ./hans.y ./hans.y跨度>
  • 最后有一个_ - 这很重要。语法为sh -c <script> <$0> <$1> ..._ 分配给$0。您可以删除它并在脚本中使用$0,或者拥有它并使用$1
  • 哇。做到了。那个“_”有什么作用?
  • 以上已编辑评论。有关详细信息,请参阅 man sh 并检查 -c 选项。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2015-11-28
  • 2021-04-23
  • 2020-08-29
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多