首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大容量文件重命名,维护时间戳,但不包括

大容量文件重命名,维护时间戳,但不包括
EN

Ask Ubuntu用户
提问于 2019-02-11 15:04:02
回答 1查看 87关注 0票数 0

在Ubuntu18.10中,使用mmv将文件夹名(日期)放在多个文件夹中(“-n”标志用于查看结果):

代码语言:javascript
复制
mmv -n './????-??-??*/*.*' './#1#2#3#4-#5#6-#7#8#9/#1#2#3#4#5#6#7#8-#10.#11'

例如,转换:

代码语言:javascript
复制
./2018-12-11/DSC05287.ARW -> ./2018-12-11/20181211-DSC05287.ARW

它还皈依:

代码语言:javascript
复制
./2018-12-11/20181211-DSC05287.ARW -> ./2018-12-11/20181211-20181211-DSC05287.ARW

同时维护时间戳。

有些文件已被重命名,有些文件没有重命名。

如何筛选命令以排除与模式匹配的文件--以8位数开头的文件,后面是连字符?

还是我需要一个不同的方法?

EN

回答 1

Ask Ubuntu用户

发布于 2019-02-11 16:39:07

我并不是一刀切的重命名实用程序的粉丝,所以我将只使用“标准设备”,特别是bashfindmv来实现它。

假设您只对位于某个目录下的文件感兴趣(所以是find -maxdepth 2),特别是忽略以前已经重命名的文件(但是使用regex反向引用进行正常检查以避免假设):

代码语言:javascript
复制
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

并修复那些已经错误地“双日期”(同样,使用反向引用以避免不必要的假设):

代码语言:javascript
复制
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

继续阅读:

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1117389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档