我在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个文件,如:
我想在目的地获得2个文件夹(/ Volumes / WDigital / Images / Project1 /)
我发现可以在这里使用“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!"
答案 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
使我感到困惑,所以我改变了它。