将文件名中包含日期的文件移动到目录

将文件名中包含日期的文件移动到目录

需要帮助使用我可以在 cronjobs 中设置的脚本按名称中的日期对文件进行排序。我试图提取并创建目录的字符串是YYYYMMDDDHHMMSS,这存在于所有文件名中。

# ls
AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

即 ABC.DVCSR1234_20191101120130_BLAH_97.msg 来自

/home/user/files/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

/home/user/files/2019/11/01/AB.CDEFGHIJ0KLM_NO_1234P5678_QR_9012_YYYYMMDDHHMMSS_345678_ETH2_Testing-run_0.msg

我有数千个需要重新组织以放入文件结构的文件。

答案1

假设要移动的文件包含以下模式_YYYYMMDDHHMMSS_

#!/bin/bash

cd /home/user/files
for file in *.msg; do
  date=$(printf "$file" | sed -nE 's/.*_([0-9]{4})([01][0-9])([0-3][0-9])[0-2][0-9][0-6][0-9][0-6][0-9]_.*/\1\/\2\/\3/p')
  if [ -n "$date" ]; then
    mkdir -p "$date" && mv "$file" "$date"
  fi
done

答案2

哈克方法。关于解析 ls 不好、文件名中的空格破坏内容等的常见免责声明。

创建文件夹。假设所有月份都有 31 天!

mkdir -p {2017..2019}/{01..12}/{01..31}

预览它计划做什么

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}'

真实运行它,与上面相同的命令,但带有| sh标记

ls ABC* | awk -F_ '{ print "mv",$0,substr($2,0,4)"/"substr($2,5,2)"/"substr($2,7,2)"/"$0}' | sh

答案3

我已经使用以下方法来解决这个问题find

find . -type f -name "*.msg" -exec bash -c 'DIRS=$(echo ${0} | cut -d'_' -f2); mkdir -p "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"; mv "${0}" "${DIRS:0:4}/${DIRS:5:2}/${DIRS:7:2}"' {} \;

相关内容