如何在linux中包含破折号的所有子目录中重命名所有.jpg文件?

时间:2018-02-06 13:20:06

标签: linux bash unix rename bulk

我有带破折号的子文件夹(示例subdir,名称为 c-d )。我需要用所有子目录重命名所有.jpg文件,任何提示如何操作?我尝试了很多选项,但没有任何帮助(我认为因为我的子文件夹包含破折号 - ) 多谢你们! :)

1 个答案:

答案 0 :(得分:0)

$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的变量中。

跳到循环结束时,您可以看到它迭代find命令的以空值终止的输出,该命令查找名为*.jpg的文件。这是通过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来解决这个问题,但这并不容易。