Linux:批量文件名更改添加创建日期

时间:2017-04-30 21:30:32

标签: linux bash directory

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

下一步是将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

3 个答案:

答案 0 :(得分:1)

不要使用ls来生成文件名列表,只需让shell将它们全局化(这就是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看起来不错,除了cp末尾的迷路timestampcp,但这必定是拼写错误。如果您执行*.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。此外,我不确定您是否要将原始文件名保留为结果文件名的一部分,这将删除它,只是用时间戳替换文件名。

答案 1 :(得分:0)

我对name的计算进行了一些实验,以查看是否可以更简洁地得出它,并提出:

name=$(date "+%Y%m%d_%H%M%S" -r "$file")

答案 2 :(得分:0)

我想在该文件夹中附加所有文件名以及创建日期,并且下面的文件可以正常工作。

#############################
#!/bin/sh
for file in `ls *.JPG`;
do
mv -f "$file" "$(date -r "$file" +"%Y%m%d_%H_%M_%S")_"$file".jpg"
done
##############################