Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux:批量文件名更改添加创建日期_Linux_Bash_Directory - Fatal编程技术网

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

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

我有一个包含很多子目录的目录,包括文件。 对于每个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
不要使用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。。东西祝你好运