我已将家庭手机设置为自动将拍摄的所有照片备份到 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