【问题标题】:How to rename all .jpg files in all subdirs which contains dash in linux?如何在linux中重命名所有包含破折号的子目录中的所有.jpg文件?
【发布时间】:2018-07-16 13:50:58
【问题描述】:

我有带有破折号的子文件夹(例如名称为 c-d 的子目录)。我需要用所有子目录重命名所有 .jpg 文件,有什么提示吗?

我尝试了很多选项,但没有任何帮助(我认为是因为我的子文件夹包含破折号 -

【问题讨论】:

  • 请向我们展示您到目前为止所做的工作,以便我们为您提供帮助
  • 您重命名文件的模式是什么?什么是原始名称,您想获得什么?
  • 我试过 find -name '*.jpg' -exec rename $RANDOM.jpg $RANDOM.jpg {} \;但是在(用户提供的代码)第 3 行,“2635.jpg”附近出现(在 jpg 之前缺少运算符?)语法错误 Bareword 在(eval 4)第 1 行,靠近“#line 1 2635.jpg”
  • “重命名所有 .jpg 文件和所有子目录”是什么意思?如果文件是./a-b/c-d/e.jpg,新名称应该是什么?
  • 新名称可以是任何名称。它可以是随机的 [0-9].jpg。我有带有子文件夹 a-a b-b c-c 的文件夹 A。每个子文件夹都包含 .jpg 图像。我想重命名所有子文件夹中的所有 .jpg

标签: linux bash unix rename bulk


【解决方案1】:

$RANDOM 可以让你发生冲突。让我们改用 md5 校验和哈希,因为它们看起来是随机的,但由内容决定(这意味着唯一的冲突将是当您拥有相同的文件时)。

while IFS= read -r -d '' file; do
  mv "$file" "${file%/*}/$( md5sum "$file" |awk '{print $1}' )".jpg
done < <(find . -name '*.jpg' -print0)

这将获取每个文件内容的 md5 校验和并将文件重命名为它,保留目录结构和尾随 .jpg

由于需要保留空格,这看起来有点难看。

运行 while IFS= 循环遍历没有输入字段分隔符的内容 ($IFS)。每次迭代都会调用read -r -d '' file,它会读取以空字符分隔的内容,同时忽略反斜杠转义并将条目存储在名为$file 的变量中。

跳到循环末尾,您可以看到它在查找名为 *.jpg 的文件的 find 命令的空终止输出上进行迭代。这是通过Bash process substitution 执行的,以防止由标准管道创建的子shell 的范围问题(更多详细信息可以在BashFAQ/020 中找到,我针对此问题进行了调整)。

在循环内部,我们有实际的重命名操作,它使用command substitution 对文件运行md5sum,然后使用awk 清理它(被告知只打印第一个字段,即校验和)。目录结构由parameter expansion 保留,其中${file%/*} 去除最后一个斜线和所有尾随非斜线字符,因此我们可以将哈希和.jpg 附加到新文件名中。 (这与$(dirname "$file") 相同,但没有系统调用。)

如果您真的想要随机数并且不关心冲突,请将$( md5sum "$file" |awk '{print $1}' ) 替换为$RANDOM。如果你给mv-i选项,它会在同一目录发生冲突时提示你。

由于read 中的非标准标志和进程替换,这在 POSIX shell 或其他基本 shell 中不起作用。您或许可以使用mkfifo 和/或xargs -0 来解决这个问题,但这并不容易。

【讨论】:

    猜你喜欢
    • 2021-01-05
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2019-10-22
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    相关资源
    最近更新 更多