2017-04-30 145 views
0

我有一个包含文件的许多子目录的目录。 对于每个WAV文件,我想通过在文件开始时添加创建日期(WAV文件首次创建时的日期)(不更改文件本身的时间戳)来重命名WAV文件。Linux:批量文件名更改添加创建日期

下一步是将WAV文件转换为MP3文件,因此我将节省硬盘空间。

为此目的,我试图创建一个bash脚本,但我有一些问题。

我想保持相同的结构,原来的目录,所以我很喜欢思考的东西:

for file in `ls -1 *.wav` 
    do name=`stat -c %y $file | awk -F"." '{ print $1 }' | sed -e "s/\-//g" -e "s/\://g" -e "s/[ ]/_/g"`.wav 
    cp -r --preserve=timestampcp $dir_original/$file $dir_converted/$name 
done 
+1

只有“上次数据访问的时间,上次数据修改的时间以及上次更改文件状态的时间”。你需要哪一个? – RomanPerekhrest

+1

'用于* .wav'中的文件就可以了,你不需要反引号和ls。 – codeforester

+0

重新阅读'man stat'和其他'stat'文档。你应该能够生成所需的日期字符串,而不需要所有的awk .. | sed ..东西。祝你好运。 – shellter

回答

0

不要使用ls生成的文件名列表,只是让glob的壳他们(这就是ls *.wav做反正):

for file in ./*.wav ; do 

我想你想要的格式YYYYMMDD_HHMMSS时间戳? 你可以使用GNU datestat有输出格式的有点整洁控制:

epochtime=$(stat -c %Y "$file") 
name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav 

stat -c %Y(或%y)给出的最后修改日期,但你真的不能获取文件创建日期在Linux系统上。

cp看起来没问题,除了在timestampcp末尾的流浪cp,但那肯定是一个错字。如果您使用*.wav,则文件名将与当前目录相关,因此无需以$dir_original/作为前缀。

如果您想要浏览整个子目录,请使用Bash的globstar功能或find。事情是这样的:

shopt -s globstar 
cd "$sourcedir" 
for file in ./**/*.wav ; do 
    epochtime=$(stat -c %Y "$file") 
    name=$(date -d "@$epochtime" +%Y%m%d_%H%M%S).wav 
    dir=$(dirname "$file") 
    mkdir -p "$target/$dir" 
    cp -r --preserve=timestamp "$file" "$target/$dir/$name" 
done 

这里的略有不便的是,cp不能创建在路径中的目录,所以我们需要使用mkdir那里。另外,我不确定是否要将原始文件名保留为结果文件的一部分,这会将其删除,并用时间戳替换文件名。