2017-07-22 139 views
1

我一直在使用以下shell bin/bash腳本作爲應用程序,我可以放置文件夾,並且它將更新修改日期文件夾以匹配該文件夾中最近修改的文件。更改多個文件夾的修改日期以匹配最近修改的文件的日期

for f in each "[email protected]" 
do 
    echo "$f" 
done 
$HOME/setMod "[email protected]" 

這會獲取文件夾名稱,然後將它傳遞給我的home文件夾中的setMod腳本。

#!/bin/bash 
# Check that exactly one parameter has been specified - the directory 
if [ $# -eq 1 ]; then 
    # Go to that directory or give up and die 
    cd "$1" || exit 1 
    # Get name of newest file 
    newest=$(stat -f "%m:%N" * | sort -rn | head -1 | cut -f2 -d:) 
    # Set modification date of folder to match 
    touch -r "$newest" . 
fi 

但是,如果我同時掉在這多個文件夾,它不會工作,我無法弄清楚如何使它同時處理多個文件夾中的工作。

此外,我從Apple Support瞭解到,我的文件夾中有很多文件夾不斷更新mod date的原因是由於某些與Time Machine相關的進程,儘管我多年以來沒有觸及其中的某些文件。如果有人知道一種方法來防止這種情況發生,或者以某種方式自動定期更新文件夾修改日期以匹配其中最近修改過的文件的日期/時間,這將使我無需運行此步驟手動相當經常。

回答

1

setMod腳本當前只接受一個參數。 你可以讓它接受很多參數並循環使用,或者你可以讓調用腳本使用一個循環。

我採取第二種選擇,因爲調用者腳本有一些錯誤和弱點。這是修正和擴展你的目的:

for dir; do 
    echo "$dir" 
    "$HOME"/setMod "$dir" 
done 

或者使setMod接受多個參數:

#!/bin/bash 

setMod() { 
    cd "$1" || return 1 
    # Get name of newest file 
    newest=$(stat -f "%m:%N" * | sort -rn | head -1 | cut -f2 -d:) 
    # Set modification date of folder to match 
    touch -r "$newest" . 
} 

for dir; do 
    if [ ! -d "$dir" ]; then 
     echo not a directory, skipping: $dir 
     continue 
    fi 

    (setMod "$dir") 
done 

注:

  • for dir; do相當於for dir in "[email protected]"; do
  • 括號大約在(setMod "$dir")使它運行在一個子shell中,以便腳本本身不改變工作目錄,cd操作的效果僅限於(...)
+0

輝煌!我喜歡這個社區!這就像一個魅力。謝謝你,先生! –

+0

有沒有一些方法可以修改它,以便它遞歸運行,深入到我放在應用程序上的任何文件夾中的子文件夾的最低級別,修改每個文件夾中的修改日期,然後繼續工作到頂層文件夾? 另外,這個腳本會忽略.DS_Store文件嗎?這些是由操作系統更新的文件,並導致文件夾的修改日期也被更新。我希望有一些方法可以簡單地防止這種情況發生。 再次感謝! –

相關問題