web-dev-qa-db-ja.com

フォルダーの変更日を最後に変更されたファイルに変更するにはどうすればよいですか?

私のメディアセンターディレクトリでは、私のフォルダーのすべての変更時刻が、どういうわけか望ましい日付ではありません。

メインフォルダーのすべての変更日時を各フォルダー内の最新のメディアファイルの変更日時に変更するにはどうすればよいですか?

例えば:

cd /tmp
mkdir test
cd test
mkdir d1
mkdir d2
touch d1/text1.txt
touch d1/movie1.mov
touch d2/text2.txt
touch d2/movie2.mov
touch notthis.file

今私は試しました:

ls -td *| head -n 1

しかしそれは与える:

notthis.file
6
rubo77

zshの場合:

cd that-dir &&
  touch -r *(D.om[1]) .

サブディレクトリ内のファイルも考慮する場合は、次のようにします。

touch -r **/*(D.om[1]) .

そして、あなたがすべてのディレクトリに対してそれをしたいなら:

for d (**/*(D/)) touch -r $d/*(D.om[1]) -- $d
4

ディレクトリを設定できますyour_dirのタイムスタンプは、この怪物で最後に変更されたファイルのタイムスタンプです。

touch -t `ls -ltr --time-style='+%Y%m%d%H%M.%S your_dir' | grep '^-' | tail -1 | awk '{print $6}'` your_dir

「メインフォルダー」の意味が明確でないため、再帰は含めていません。

2
Flup

ls(1)を使用して変更時刻でディレクトリを並べ替え、head(1)を使用して最初のファイルを取得し、touch(1)を使用してターゲットディレクトリの変更時刻を変更します。とても簡単。

通常はlsの出力を解析することはお勧めできません。特殊文字が必要になることはほとんどなく、簡単に追いつくことができるためですが、この場合、ファイルを簡単に取得できる別のツールは考えられません。ディレクトリ内の最新のタイムスタンプ。

touch_dir() {
    dir="$1"
    touch --reference="$(ls -td "${dir}"/* | head -n 1)" "${dir}"
}

ディレクトリである引数を指定して実行すると、ディレクトリの変更時刻が、ディレクトリ内のファイルの最新の変更時刻に設定されます。

ディレクトリにファイルがない場合(いくつかの方法で簡単にテストできます)、または最新のファイル名に改行が埋め込まれている場合は失敗します-headは新しい行の前の部分のみを取得します。

多くのディレクトリを更新するには、ループで実行するだけです。

2
camh