2017-07-22 6 views
1

私はフォルダを削除できるアプリケーションとして以下のシェルbin/bashスクリプトを使用していました。そのフォルダ内の最も最近変更されたファイルと一致するようにします。複数のフォルダのうち、最近変更されたファイルのものと一致するように変更された日付を変更しました

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

これはフォルダ名を取得し、それをホームフォルダのこの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 

しかし、それは動作しません、と私はそれが一度に複数のフォルダを動作させる方法を見つけ出すことはできません。

また、アップルサポートから、私のフォルダの多くが更新日時を更新し続けている理由は、タイムマシンに関連した処理が原因であることが分かっています。誰かがこれが起こらないようにする方法を知っている場合や、最近更新されたファイルの日付/時刻と一致するようにフォルダの修正日を何らかの形で自動的に定期的に更新すると、この手順を実行する必要がなくなります手動できれいに定期的に。

答えて

1

setModスクリプトの現在のパラメータは1つだけです。 の多くのパラメータを受け入れてループするか、呼び出し元のスクリプトにループを使用させることができます。

2番目のオプションは、呼び出し元スクリプトにいくつかの間違いや弱点があるためです。ここでは、修正し、あなたの目的のために拡張されています

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; dofor dir in "[email protected]"; do
  • 括弧に相当します(setMod "$dir")をサブシェルで実行するようにして、スクリプト自身cd操作の効果はサブシェルに限定されている(...)
+0

ブリリアント!私はこのコミュニティが大好き!それは魅力のように機能します。ありがとうございます! –

+0

これを変更して再帰的に実行する方法はありますか?アプリケーションにドロップしたフォルダのサブフォルダの最下位レベルまで掘り下げ、それぞれの修正日を修正してから作業を進めますトップレベルのフォルダに? また、このスクリプトは.DS_Storeファイルを無視しますか?これは、OSによって更新されるファイルであり、フォルダの変更日も更新されます。これが起こらないようにする方法がいくつかあるといいですね。 もう一度おねがいします! –

関連する問題