在 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)设备”来做到这一点,具体来说bash
,find
和mv
。
假设您只对目录级别较低(因此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
进一步阅读:
- 正则表达式.info: 如果你需要正则表达式方面的帮助
- bash(1) 手册页:搜索
=~
运算符,然后读取特殊BASH_REMATCH
数组 - findutils | 正则表达式
find
:有关 GNU和所支持的令人惊奇的多种正则表达式的详细信息locate
。