简体   繁体   English

Linux 根据文件名中的 ddmmyyyy 日期将大量图像分类到文件夹中

[英]Linux sorting large number images into folders based on ddmmyyyy date in filenames

I have a large number of images in the following format -我有大量以下格式的图像 -

randomname_08042020_1837_sometext_somemoretext.jpg
randomname_17012022_1650_sometext_somemoretext.th.jpg
randomname_08042020_1837_sometext_somemoretext.th.jpg
randomname_17012022_1658_sometext_somemoretext.jpg
randomname_09042020_0009_sometext_somemoretext.jpg
randomname_17012022_1658_sometext_somemoretext.th.jpg
randomname_09042020_0009_sometext_somemoretext.th.jpg
randomname_17012022_1711_sometext_somemoretext.jpg
randomname_15062020_1736_sometext_somemoretext.jpg
randomname_17012022_1711_sometext_somemoretext.th.jpg
randomname_15062020_1736_sometext_somemoretext.th.jpg
randomname_17012022_1719_sometext_somemoretext.jpg
randomname_09052020_1812_sometext_somemoretext.jpg
randomname_17012022_1719_sometext_somemoretext.th.jpg
randomname_09052020_1812_sometext_somemoretext.th.jpg
randomname_17012022_1730_sometext_somemoretext.jpg
randomname_09052020_1838_sometext_somemoretext.jpg
randomname_17012022_1730_sometext_somemoretext.th.jpg
randomname_09052020_1838_sometext_somemoretext.th.jpg
randomname_17092021_2340_sometext_somemoretext.jpg

I require a script to sort them into yyyy/mm/dd folders (and create the folders) based on the date in the filename, which is located after the first underscore in a ddmmyyyy format.我需要一个脚本根据文件名中的日期将它们分类到 yyyy/mm/dd 文件夹(并创建文件夹),文件名位于 ddmmyyyy 格式的第一个下划线之后。

I've tried various suggestions from other answers using sed but none of them work.我已经使用 sed 尝试了其他答案的各种建议,但都没有用。 randomname, sometext and somemoretext are not constant length variables randomname、sometext 和 somemoretext 不是常量变量

Edit - to add what I have tried so far.编辑 - 添加我到目前为止尝试过的内容。

Someone came up with a solution based on a similar question with a different date format in the filename YYYYMMDDHHMMSS and was given this code as an answer -有人基于文件名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

Which I attempted to tweak by moving the regex capture elements around to suit my file date format DDMMYYY -我试图通过移动正则表达式捕获元素来调整以适应我的文件日期格式DDMMYYY -

#!/bin/bash

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

But this did not work, there was no movement of files or any error, just nothing happened.但这没有用,没有文件移动或任何错误,什么也没发生。

With bash :使用bash

for f in *.jpg; do
  if [[ "$f" =~ _([0-9]{2})([0-9]{2})([0-9]{4})_ ]]; then
   dir="${BASH_REMATCH[3]}/${BASH_REMATCH[2]}/${BASH_REMATCH[1]}"
   echo mkdir -p "$dir"
   echo mv "$f" "$dir";
  fi
done

Remove both echo s if output looks fine.如果 output 看起来不错,请删除两个echo

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM