2016-11-07 74 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 
相關問題