我经常将一堆名为"未知.png"的文件放入一个文件夹中,并且经常将它们重命名为"未知(1(.png,未知(2(.png"等。这是一个有点问题,因为有时在清理文件并将其移动到其他地方时,我会被问到是否要替换或重命名等。
所以我决定做一个crontab任务,将文件重命名为CB_RANDOM这样我什至不必担心可能覆盖两个同名文件。
到目前为止,我可以弄清楚,我找到了文件,将名称 Unknown 替换为 CB_ 并添加一个随机数。
问题出在文件名末尾的 (X( 上。我也设法弄清楚如何解决它,我只是去掉了任何括号和数字。
问题是我无法弄清楚如何使重命名函数遵循这两个规则。
for u in (find -name unknown*); do
rCode = random
rename -v 's/unknown/CB_$rCode' $u
rename -v 's/[ ()0123456789]//g' $u
理想情况下,我希望能够在同一行代码上遵循这两个规则,特别是因为一旦它运行第一行,那么$u将无法找到第二步的文件。
不需要循环:
find -name 'unknown*' -exec rename 's/unknown ([0-9]+).(.*)$/"CB_".sprintf("%04s",int(rand(10000))).".".$1/e' {} ;
以- 递归方式
find
所有文件,从当前目录开始,名称类似于"未知 (1(.png"> - 使用类似于"CB_0135.png"的结果文件名
rename
它们
如果文件名已存在,这将生成错误消息。
你的代码应该首先改为
# find is a subcommand, use $()
# find a file with wildcard, use quotes
for u in $(find -name "unknown*"); do
# Is random a command? Use $()
rCode=$(random)
# Debug with echo, will show other problem
echo "File $u"
# $rCode will not be replaced by its value in single quotes
# Write a filename in double quotes, so it will not be split by a space
rename -v "s/unknown/CB_$rCode" "$u"
rename -v 's/[ ()0123456789]//g' "$u"
done
带有 echo
的新行表明循环正在分解空格处的文件名。您可以在
while IFS= read -r u; do
# Use unique timestamp, not random value
rCode=$(date '+%Y%m%d_%H%M')
echo "File $u"
rename -v "s/unknown/CB_$rCode" "$u"
rename -v 's/[ ()0123456789]//g' "$u"
done < <(find -name "unknown*")
我从不使用rename
,并且会使用
while IFS= read -r u; do
# Use unique timestamp, not random value
rCode=$(date '+%Y%m%d_%H%M')
# construct new filename.
# Restriction: Path to file is without newlines, spaces or parentheses
newfile=$(sed 's/[ ()]//g; s/.*unknown/&_'"${rCode}"'_/' <<< "$u")
echo "Moving file $u to ${newfile}"
mv "$u" to "${newfile}"
done < <(find -name "unknown*")
编辑:
我删除了一个sed
命令,用于重命名包含(something)
的文件:
# Removed command
newfile=$(sed 's/(.*)((.*))/1'"${rCode}"'_2/' <<< "$u")