我有一个包含很多子目录的目录,包括文件。 对于每个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
答案 0 :(得分:1)
不要使用ls
来生成文件名列表,只需让shell将它们全局化(这就是ls *.wav
所做的事情):
for file in ./*.wav ; do
我认为你想要格式为YYYYMMDD_HHMMSS
的时间戳?
您可以使用GNU date
和stat
来更好地控制输出格式:
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
##############################