Linux:批量文件名更改添加创建日期
我有一个包含很多子目录的目录,包括文件。 对于每个WAV文件,我想通过在文件开头添加创建日期来重命名WAV文件,当文件WAV首次创建时,不改变文件本身的时间戳 下一步是将WAV文件转换为MP3文件,这样我将节省硬盘空间 为此,我正试图创建一个bash脚本,但我遇到了一些问题 我想保持与原始目录相同的结构,因此我想到了如下内容:Linux:批量文件名更改添加创建日期,linux,bash,directory,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 }' | se
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
不要使用ls生成文件名列表,只需让shell对其进行全局处理,这就是ls*.wav的作用:
for file in ./*.wav ; do
我想您想要YYYYMMDD\u 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看起来不错,除了timestampcp末尾的零散cp,但那一定是一个打字错误。如果使用*.wav,文件名将与当前目录相关,因此无需使用$dir_original/作为前缀
如果要遍历整个子目录,请使用Bash的globstar功能,或查找。大概是这样的:
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。另外,我不确定您是否希望保留原始文件名作为结果文件名的一部分,这将删除它,并用时间戳替换文件名。我对名称的计算进行了一些实验,以查看是否可以更简洁地获得它,并得出以下结论:
name=$date+%Y%m%d\u%H%m%S-r$file我想在该文件夹中的所有文件名后面加上它们创建的日期,下面的文件名可以完美地工作
#############################
#!/bin/sh
for file in `ls *.JPG`;
do
mv -f "$file" "$(date -r "$file" +"%Y%m%d_%H_%M_%S")_"$file".jpg"
done
##############################
只有上次访问数据的时间、上次修改数据的时间和上次更改文件状态的时间。您需要哪一个?对于*.wav中的文件,您不需要backticks和ls.re-read man stat以及其他stat文档。您应该能够生成所需的日期字符串,而无需所有awk..sed。。东西祝你好运