我将下面的脚本保存在 MYFILES 目录中,以创建 x 个文件,并且它们的时间戳是随机运行多年和几个月的。
for i in {1938..2037}; do
## create a file with a random month
touch -d "${i}-$((RANDOM % 12 + 1))-01" file_$((i-1937))
done
output:
-rw-r--r-- Users 0 Jul 1 1938 file_1
-rw-r--r-- Users 0 Jun 1 1947 file_10
-rw-r--r-- Users 0 Oct 1 2037 file_100
请帮助了解如何创建脚本来分析 MYFILES 目录的内容并对子目录 FILES2 中的文件进行排序,然后根据文件的时间戳重命名文件。
示例输出应该是:
rw-r--r-- Users 0 Jul 1 1938 file_JUL1938
rw-r--r-- Users 0 Jun 1 1947 file_JUN1947
rw-r--r-- Users 0 Oct 1 2037 file_OCT2037
答案1
使用 GNU date 和 stat 来收集和反转信息:
for f in *
do
ref=$(stat -c %y "$f" | awk '{print $1}')
mon=$(date -d "$ref" +%b)
year=$(date -d "$ref" +%Y)
echo mv -- "$f" "file_${mon^^}${year}"
done
这使用 bashism 将月份大写;如果不可用,请使用echo "$mon" | tr '[:lower:]' '[:upper:]'
.另一种选择是使用最近的日期功能来返回月份的大写版本date +%^b
:
要创建示例文件:
touch -d 1938-07-01 file_1
touch -d 1947-06-01 file_10
touch -d 2037-10-01 file_100
示例输入上的脚本输出:
mv -- file_1 file_JUL1938
mv -- file_10 file_JUN1947
mv -- file_100 file_OCT2037
答案2
ls -l file_* |
awk '{system("echo mv -v -- " $9 " file_" toupper($6) $8);}'
对于真正的文件重命名,echo
应该删除该单词。
解释
ls -l file_* | awk
- 列出所有文件并将它们发送到awk
.system()
- 执行外壳命令。mv -v -- " $9 " file_" toupper($6) $8
-mv
mv
-在 shell 中执行的常用命令。toupper(str)
- 返回字符串的副本斯特,其中所有小写字符斯特翻译为相应的大写字母。$6
- 月份:八月、七月、二月$8
- 年份:1938、1947、2037。$9
- 文件名:file_1、file_10、file_100。
文件
$ ls -l file_*
-rw-rw-r-- 1 user user 0 Aug 1 1938 file_1
-rw-rw-r-- 1 user user 0 Jul 1 1947 file_10
-rw-rw-r-- 1 user user 0 Feb 1 2037 file_100
输出
mv -v -- file_1 file_AUG1938
mv -v -- file_10 file_JUL1947
mv -v -- file_100 file_FEB2037