批量文件重命名,保留时间戳,排除一些

批量文件重命名,保留时间戳,排除一些

在 Ubuntu 18.10 中一直使用 mmv 将文件夹名称(日期)添加到多个文件夹中的文件名前面(此处使用'-n'标志来查看结果):

mmv -n './????-??-??*/*.*' './#1#2#3#4-#5#6-#7#8#9/#1#2#3#4#5#6#7#8-#10.#11'

例如转换:

./2018-12-11/DSC05287.ARW -> ./2018-12-11/20181211-DSC05287.ARW

它还可以转换:

./2018-12-11/20181211-DSC05287.ARW -> ./2018-12-11/20181211-20181211-DSC05287.ARW

同时保留时间戳。

有些文件已重命名,有些则尚未重命名。

我如何过滤命令以排除与模式匹配的文件(以 8 位数字开头后跟连字符的文件)?

或者我需要采用不同的方法?

答案1

我并不是一体化重命名实用程序的粉丝,因此我将只使用“标准(GNU)设备”来做到这一点,具体来说bashfindmv

假设您只对目录级别较低(因此find -maxdepth 2)的文件感兴趣,并且特别忽略已经重命名的文件(但使用正则表达式反向引用进行健全性检查以避免做出假设):

find -regextype egrep -maxdepth 2 -type f \! -regex '\./([0-9]{4})-([0-9]{2})-([0-9]{2}).*/\1\2\3-.+' | while read f; do

  if [[ $f =~ ^(\./([0-9]{4}-[0-9]{2}-[0-9]{2}).*)/(.+)$ ]]; then
    # The above regex groups its matches into:
    # ${BASH_REMATCH[1]} = the dir pathname
    # ${BASH_REMATCH[2]} = the date in the dir pathname (remember to strip its dashes)
    # ${BASH_REMATCH[3]} = the file name

    mv -v "$f" "${BASH_REMATCH[1]}"/"${BASH_REMATCH[2]//-}-${BASH_REMATCH[3]}"

  fi

done

并修复那些已经被错误地“重复注明日期”的内容(再次使用反向引用来避免做出不必要的假设):

find -regextype egrep -maxdepth 2 -type f -regex '\./([0-9]{4})-([0-9]{2})-([0-9]{2}).*/\1\2\3-\1\2\3-.+' | while read f; do

  if [[ $f =~ ^(\./.+)/([0-9]{8})-[0-9]{8}-(.+)$ ]]; then
    # The above regex groups its matches into:
    # ${BASH_REMATCH[1]} = the dir pathname
    # ${BASH_REMATCH[2]} = the first date chunk
    # ${BASH_REMATCH[3]} = the filename "tail"

    mv -v "$f" "${BASH_REMATCH[1]}/${BASH_REMATCH[2]}-${BASH_REMATCH[3]}"

  fi

done

进一步阅读:

相关内容