【问题标题】:Linux: batch filename change adding creation dateLinux:批量文件名更改添加创建日期
【发布时间】:2017-04-30 21:30:31
【问题描述】:

我有一个包含很多子目录的目录,包括文件。 对于每个 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

【问题讨论】:

  • 只有“最后一次访问数据的时间,最后一次修改数据的时间,最后一次改变文件状态的时间”。你需要哪一个?
  • for file in *.wav 可以,不需要反引号和 ls。
  • 重新阅读 man stat 和其他 stat 文档。您应该能够在没有所有 awk ..| sed .. 的情况下生成所需的日期字符串。祝你好运。

标签: linux bash directory


【解决方案1】:

不要使用ls 来生成文件名列表,只需让shell 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。另外,我不确定您是否想保留原始文件名作为结果文件的一部分,这将删除它并用时间戳替换文件名。

【讨论】:

    【解决方案2】:

    我对@9​​87654321@的计算做了一些实验,看看是否可以更简洁地得到它,并想出了这个:

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

    【讨论】:

      【解决方案3】:

      我想在该文件夹中的所有文件名后面加上它们的创建日期,下面的效果很好。

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

      【讨论】:

        猜你喜欢
        • 2015-11-17
        • 1970-01-01
        • 1970-01-01
        • 2010-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-08
        相关资源
        最近更新 更多