我正在尝试使用脚本添加时间戳前缀并为文件添加扩展名。我有文件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 解析器来解析时间戳。