如何使用多个规则创建重命名脚本?



我经常将一堆名为"未知.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")

最新更新