按日期范围将照片过滤到目录中

按日期范围将照片过滤到目录中

我已将家庭手机设置为自动将拍摄的所有照片备份到 NAS (Qnap TS-231P),每个手机一个文件夹。一部手机,由于某种原因,很多照片在没有警告的情况下被复制了多次。另外,似乎有些照片是在48MP模式下拍摄的,大文件也是如此。有314281 个文件,总计 2.19 TB

现在,该文件夹太大了,以至于无法加载并且实际上无法浏览/使用(在 Windows、Qnap 软件、手机上的应用程序等中)。我已经使用SSH访问NAS的Linux操作系统,并且可以导航到相应的目录。我尝试了du -h该目录,但 40 分钟后它仍在思考(上面的大小来自 Qnap 软件)。

我感觉这些文件没有真正的问题,因此将文件放在多个文件夹中可能会有所帮助。

如何输入命令以按修改日期过滤文件,例如每月一个文件夹或每季度一个文件夹?

为了获得奖励积分,在我做任何事情之前是否可以获得(即导出到 .txt 或 .csv)314281 文件的报告?

我是 Linux 的新手,所以请耐心等待。

答案1

我有类似的东西

自 2019 年 4 月以来,我一直在使用 shellscript 来实现类似的目的,因此它经过了很好的测试。

  • 它是针对我的数据分区的安装点进行硬编码的。你必须修改它。

  • 它将文件名移至小写。您可能想跳过它。

  • 它没有针对您拥有的大量文件进行优化。也许它太慢了,需要调整以使其更快,甚至可能使用并行处理。

  • “main”中的 find 命令和它周围的命令只会浪费你的时间。我认为你应该删除它,至少对于巨大的初始批处理作业。 (这可能是您要求的报告,但我认为这只会浪费时间。)

  • 如果在移动文件的位置找到不同的同名文件,则它是交互式的。这可能会被删除以提高速度,至少对于巨大的初始批处理作业来说是这样。

  • 请记住,该mv命令在同一文件系统内移动时速度很快,但在文件系统之间(分区之间)移动(复制和删除)速度较慢。

修改后,请在开始大工作之前在少量文件上进行测试。

pict2dirtree

#!/bin/bash


function doit {

 fildir=$(find -name "$1" -printf "%TY/%Tm/%Td")
 lcas=${1##.*}
 lcas=${lcas,,}
 fildir="/media/multimed-2/Photos/$fildir"
 mkdir -p "$fildir"
 filnam="$fildir/${lcas}"
#echo "fildir=$fildir"
#echo "filnam=$filnam"
#echo "$lcas"
#exit
 if test -s "$filnam"
 then
  diff -q "$1" "$filnam"
  if [ $? -eq 0 ]
  then
   rm "$1"
  else
   read -p "move to '_$lcas' (y/N) " ans
   if [ "$ans" == "y" ]
   then
    mv -i "$1" "${fildir}/_$lcas"
   fi
  fi
 else
  mv "$1" "$filnam"
 fi
}

########################################################################

# main

########################################################################

if [ "$(whoami)" == "root" ]
then
 echo "Usage: Do *not* run with sudo"
 exit
fi

find -maxdepth 1 -type f -exec ls -l --time-style=long-iso "{}" \;|tr -s ' ' ' '|cut -f 6,8|sort|more
echo "Move files from the current directory (no subdirectories)"
read -p "Are you ready to move these files (y/N) " ans
if [ "$ans" != "y" ]
then
 exit
fi

for i in *
do
 if test -f "$i"
 then
  doit "$i"
 else
  echo "skipping $i"
 fi
done

相关内容