重命名文件名并添加日期和时间前缀

重命名文件名并添加日期和时间前缀

我正在尝试使用脚本添加时间戳前缀并为文件添加扩展名。我有文件ABC我将被重命名为ABC.txt

DIRECTORY=`find /path/to/file -type f ! -name "*.*"`
NOW=$(date +%Y-%m-%d-%H%M%S)

for file in $DIRECTORY; do

    mv "$file" "$file"_"${NOW}.txt"
    done

上面的输出有效,但作为后缀,如果我将其切换

    mv "$file" "${NOW}"$file".txt"

我越来越不能mv:无法移动`2019-10-18-231254/path/to/file/ABC.txt':没有这样的文件或目录

我可以看到问题出在 $Directory 上,因为这是在执行 mv 时调用完整路径。有人可以帮忙简化这个吗?

答案1

我建议避免循环find命令的输出,原因如下:

相反,请考虑使用-execdir, 和 shell 单行代码来删除路径组件:

#!/bin/bash

export NOW=$(date +%Y-%m-%d-%H%M%S)

find /path/to/file -type f ! -name '*.*' -execdir sh -c '
  for f; do echo mv "$f" "${NOW}_${f#./}"; done
' find-sh {} +

echo一旦您很高兴它正在做正确的事情,请将其删除。请注意,NOW需要导出,以便其值在子 shell 中可用sh -c

如果您的find实现不提供-execdir,那么您可以使用-exec显式删除并替换路径:

find /path/to/file -type f ! -name '*.*' -exec sh -c '
  p="${1%/*}"; echo mv "$1" "$p/${NOW}_${1##*/}"
' find-sh {} \;

答案2

使用 GNU 并行:

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y-%m-%d-%H%M%S)_{/}.txt

请考虑使用 ISO8601 作为时间戳:

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y-%m-%dT%H:%M:%S)_{/}.txt

或者:

find /path/to/file -type f ! -name "*.*" -print0 |
  parallel -0 mv {} {//}/$(date +%Y%m%dT%H%M%S)_{/}.txt

这意味着您可以稍后使用标准化的 ISO8601 解析器来解析时间戳。

相关内容