2016-11-07 72 views
0

我在OSX上使用了一个bash脚本,它将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 - 上次更改时间:08102016
  • image2.jpg - 上次更改时间:10102016
  • image3.jpg - 上次更改时间:08102016

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

  • 文件夹08102016 - 包含图像1和图像3
  • 文件夹10102016 - 包含图像2

我发现可以用在这里走出修改日期的“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循环路径/卷/未命名/ 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!" 

回答

1

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

所有你需要做的就是捕捉stat命令的输出,这样就可以把它分配给您的creationdate

#!/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时,它不是一个索引混淆了我所以我改变了。

2

不知道你是如何使用统计,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 
相关问题