将文件(图像)复制到根据创建日期构建的文件夹

时间:2016-11-07 19:10:08

标签: bash macos file date

我在OSX上使用bash脚本,它将所有iamges从SD卡复制到我的外部硬盘。

脚本如下所示:

#!/bin/bash 
now=$(date +"%d%m%Y") 
mkdir -p /Volumes/WDigital/Images/Project1/$now 
find /Volumes/Untitled/DCIM/ -name '*.JPG' -print0 | xargs -0 -J % rsync --progress --times % /Volumes/WDigital/Images/Project1/$now

此脚本根据当前日期创建一个文件夹,并将所有图像复制到此目的地。

我想稍微修改一下这个脚本,以便将每个图像复制到一个文件夹中,该文件夹以特定图像的创建日期(与上次修改时相同)命名。

所以,如果我有3个文件,如:

  • image1.jpg - lastModified:08102016
  • image2.jpg - lastModified:10102016
  • image3.jpg - lastModified:08102016

我想在目的地获得2个文件夹(/ Volumes / WDigital / Images / Project1 /)

  • 文件夹08102016 - 包含image1和image3
  • 文件夹10102016 - 包含image2

我发现可以在这里使用“stat”命令(Print a file's last modified date in Bash)来获取修改日期,但我不确定如何正确地将其合并。

我的想法是有一个像(伪代码)

的循环
#!/bin/bash 
for i in /Volumes/Untitled/DCIM/*/*.jpg; do
  creationdate = stat -f "%Sm" -t "%d%m%Y" "$i"
  rsync --progress --times $i /Volumes/WDigital/Images/Project1/$creationdate
done

如何为路径使用for循环/ Volumes / Untitled / DCIM / / .jpg?

或者你们中的任何人都知道另一个方向可以找到合适的解决方案吗?

由于

修改

这是我的工作代码(带计数器):

#!/bin/bash 
counter=0
completefilenumber=$( find "/Volumes/Untitled/DCIM/" -type f -iname '*.JPG' | wc -l )
find "/Volumes/Untitled/DCIM/" -type f -iname "*.JPG" -print0 | while IFS= read -r -d $'\0' img; do
  counter=$((counter+1))
  echo "$img (Nr. ${counter}/${completefilenumber})" 
  creationdate=$(stat -f "%Sm" -t '%d%m%Y' $img)
  mkdir -p /Volumes/WDigital/Images/Project1/$creationdate
  rsync --times $img /Volumes/WDigital/Images/Project1/$creationdate
done
echo "Script done!"

2 个答案:

答案 0 :(得分:2)

不确定您如何使用stat,ls是获取时间的好方法。既然你想逐个文件去,rsync可能有点重负。一个解决方案:

for file in /Volumes/Untitled/DCIM/*/*.jpg; do
    creationdate=$(ls -lt --time-style=+%m%d%y | cut -d" " -f6)
    mkdir -p /Volumes/WDigital/Images/Project1/$creationdate
    cp $file /Volumes/WDigital/Images/Project1/$creationdate

答案 1 :(得分:1)

我假设您的stat代码有效。你的“伪代码”非常接近正确。

您需要做的就是捕获stat命令的输出,以便将其分配给您的创建日期

#!/bin/bash 
for img in /Volumes/Untitled/DCIM/*/*.jpg; do
  creationdate=$(stat -f "%Sm" -t "%d%m%Y" "${img}")
  rsync --progress --times $img "/Volumes/WDigital/Images/Project1/${creationdate}"
done

查看“命令替换”。

基本上你可以在$()中包装任何命令来捕获它的输出。这允许您将其分配给变量。它变得比这更复杂,并且有一些问题,但这是一般的概念,一些谷歌搜索会带你到很多文章,可以解释它比我能更好。

当它不是索引时使用$i使我感到困惑,所以我改变了它。