我有一系列以下格式的文件:
目录中的YYYYMMDDHHmmXXXXXX.m4a
我想编写一个脚本,允许我将每个文件名存储为变量,我们称之为 MyFile,然后将“YYYMMDDHHmm”(每个文件的前 12 个字符)存储为变量,我们称之为 TimeStamp 和使用它来更新循环中每个文件的创建日期数据。该命令应类似于:
touch -t TimeStamp Myfile.m4a
我是编写脚本的新手,并且编写了以下内容,该内容在第 17 行返回意外结束
#!/usr/bin/env bash
for f in /Users/username/music/M4Atest/*.m4a;
do filename=${f%%.*};
echo ${filename};
for ${filename};
do timestamp="${filename:0:12}";
echo ${timestamp};
done;
感谢您的帮助
最佳答案
一个循环就足够了,使用 ${f##*/}
删除最长的前缀模式 */
来获取文件名。
#!/bin/bash
shopt -s nullglob # expands a glob pattern to a null string if the pattern doesn't match
for f in /Users/username/music/M4Atest/*.m4a; do
filename=${f##*/}
touch -t "${filename:0:12}" "$f"
done
如果您想要更安全的文件名模式,可以使用[0-9][0-9][0-9][0-9][01][0-9][0-3] [0-9][0-2][0-9][0-5][0-9]?*.m4a
而不是 *.m4a
。这将确保您的文件名至少包含时间戳加一个字符 (?
) 加上任意数量的字符 (*
),后跟后缀 .m4a
.
# explanation:
# [0-9][0-9][0-9][0-9][01][0-9][0-3][0-9][0-2][0-9][0-5][0-9]?*.m4a
# Y Y Y Y M M D D H H m m
关于Bash 循环获取文件名中的前 12 个字符,使用输出为每个文件运行 touch -t 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61176117/