Bash 循环获取文件名中的前 12 个字符,使用输出为每个文件运行 touch -t 命令

标签 bash loops date

我有一系列以下格式的文件:

目录中的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/

相关文章:

bash - 使用 ed 操作 find 匹配的文件

python - 将 csv 文件中的日期字段读取到数据框中

python - 将 Pandas 日期列转换为天

python - 基于日期的切片 Pandas Dataframe

bash - 'eval $command' 和 $command 有什么区别?

linux - 使用 bash 变量进入目录

bash - sed,只捕获数字

c - For 循环卡住 (.C)

javascript - 找到距离原点 (0, 0) 最近的 K 个点

C语言删除字符串中所有重复字符的程序