Answers:
快速且肮脏的Bash一线式将当前目录中的所有(globbed)文件从重命名filename.txt
为filename.txt-20120620
:
for f in *; do mv -- "$f" "$f-$(stat -c %Y "$f" | date +%Y%m%d)"; done
我敢肯定,一个有进取心的Bash书呆子会发现一些突破的方法。:)
显然,这并没有实现所需的功能,例如检查文件是否已经具有结束日期的内容。
date
实现?我的GNU date
似乎不处理输入。
这是goldschrafe的单线版本:
还可以处理以短划线开头的文件名
for f in *; do mv -- "$f" "$f-$(date -r "$f" +%Y%m%d)"; done
date -r "$f" +%Y%m%d
否则POSIXLY_CORRECT
在环境中将不起作用。通常,选项应该放在其他参数之前。
"${f}"
。
必需的zsh单线(不计算一次性组件的一次性加载):
zmodload zsh/stat
autoload -U zmv
zmv -n '(*)' '$1-$(stat -F %Y%m%d +mtime -- $1)'
我们使用stat
来自zsh/stat
模块的内置zmv
函数,并使用函数来重命名文件。还有一个额外的功能,它将日期(如果有的话)放在扩展名之前。
zmv -n '(*)' '$1:r-$(stat -F %Y%m%d +mtime -- $1)${${1:e}:+.$1:e}'
据我了解,我们事先不知道修改日期是什么。因此,我们需要从每个文件中获取文件,格式化输出并以某种方式重命名每个文件,以使其在文件名中包含修改日期。
您可以将此脚本另存为“ modif_date.sh”,并使其可执行。我们使用目标目录作为参数来调用它:
modif_date.sh txt_collection
其中“ txt_collection”是目录的名称,我们拥有要重命名的所有文件。
#!/bin/sh
# Override any locale setting to get known month names
export LC_ALL=c
# First we check for the argument
if [ -z "$1" ]; then
echo "Usage: $0 directory"
exit 1
fi
# Here we check if the argument is an absolute or relative path. It works both ways
case "${1}" in
/*) work_dir=${1};;
*) work_dir=${PWD}/${1};;
esac
# We need a for loop to treat file by file inside our target directory
for i in *; do
# If the modification date is in the same year, "ls -l" shows us the timestamp.
# So in this case we use our current year.
test_year=`ls -Ggl "${work_dir}/${i}" | awk '{ print $6 }'`
case ${test_year} in *:*)
modif_year=`date '+%Y'`
;;
*)
modif_year=${test_year}
;;
esac
# The month output from "ls -l" is in short names. We convert it to numbers.
name_month=`ls -Ggl "${work_dir}/${i}" | awk '{ print $4 }'`
case ${name_month} in
Jan) num_month=01 ;;
Feb) num_month=02 ;;
Mar) num_month=03 ;;
Apr) num_month=04 ;;
May) num_month=05 ;;
Jun) num_month=06 ;;
Jul) num_month=07 ;;
Aug) num_month=08 ;;
Sep) num_month=09 ;;
Oct) num_month=10 ;;
Nov) num_month=11 ;;
Dec) num_month=12 ;;
*) echo "ERROR!"; exit 1 ;;
esac
# Here is the date we will use for each file
modif_date=`ls -Ggl "${work_dir}/${i}" | awk '{ print $5 }'`${num_month}${modif_year}
# And finally, here we actually rename each file to include
# the last modification date as part of the filename.
mv "${work_dir}/${i}" "${work_dir}/${i}-${modif_date}"
done
stat
实用程序或完全没有。
ls
是不可靠的。在某些Unix变体上,用户名和组名可以包含空格,这会导致日期列的对齐方式偏离。
ls
为一个日期和时间(而不是一个日期和年)必须是在本年度。这不是真的。过去六个月了;可能是上一年(例如,2016年9月27日至2016年12月31日在过去六个月之内)。(6)冒名顶格雷格的Wiki(@Gilles已经引用)的风险,包含换行符和空格的文件名可能会导致失败。…(续)
这是cas的单线版本(基于goldschrafe的单线),并扩展了幂等性,
即扩展到具有日期时间的前缀文件,并且仅对那些没有日期时间前缀的文件进行扩展。
用例:如果您将新文件添加到目录中,并想为尚未添加文件的文件添加日期时间前缀,则很有用。
for f in * ; do
if [[ "$f" != ????-??-??' '??:??:??' - '* ]]; then
mv -v -- "$f" "$(date -r "$f" +%Y-%m-%d' '%H:%M:%S) - $f" ;
fi;
done
for f in *.jpg ; do jhead -ft "$f" ; done
来源:unix.stackexchange.com/a/290755/9689