我有带破折号的子文件夹(示例subdir,名称为 c-d )。我需要用所有子目录重命名所有.jpg文件,任何提示如何操作?我尝试了很多选项,但没有任何帮助(我认为因为我的子文件夹包含破折号 - ) 多谢你们! :)
答案 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
来解决这个问题,但这并不容易。