マイメディアセンターディレクトリ内のマイフォルダのすべての変更時間は、必須の日付ではありません。
既定のフォルダ内のすべての変更時間を各フォルダ内の最新のメディアファイルの変更時間にどのように変更できますか?
たとえば、
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
答え1
そしてzsh
:
cd that-dir &&
touch -r *(D.om[1]) .
サブディレクトリのファイルも考慮するには、次の手順を実行します。
touch -r **/*(D.om[1]) .
空でないすべてのディレクトリに対してこの操作を繰り返し実行するには、次の手順を実行します。
for d (**/*(DFod)) touch -r $d/*(D.om[1]) -- $d
通常のファイルがない空でないディレクトリがある場合(含まれるすべてのファイルがディレクトリ、シンボリックリンク、fifos ...などの非標準ファイルの場合)、「一致エントリが見つかりません」というエラーが発生します。これを防ぐには、次のように変更できます。
for d (**/*(DFod)) {
newest=($d/*(ND.om[1]))
(( $#newest )) && touch -r $newest -- $d
}
.
通常のファイルに制限したくない場合は、glob修飾子を削除してください。一般ファイルへのシンボリックリンク(およびそのファイルが指すファイルの変更時間)も考慮するには、glob修飾子を削除します-
。^/
または、^/,F
空のディレクトリ(非ディレクトリまたはF
空のディレクトリ)を除くすべての種類のファイル。
答え2
次のモンスターを使用して、ディレクトリyour_dir
のタイムスタンプを最後に変更されたファイルのタイムスタンプに設定できます。
touch -t `ls -ltr --time-style='+%Y%m%d%H%M.%S your_dir' | grep '^-' | tail -1 | awk '{print $6}'` your_dir
「メインフォルダ」が何を意味するのか明確ではないので、再帰は含まれていません。
答え3
ls(1)
変更時間ごとにディレクトリソートを使用し、最初のファイルをインポートhead(1)
し、touch(1)
ターゲットディレクトリの変更時間を変更することは非常に簡単です。
解析された出力はls
ほとんど必要なく、特殊文字に閉じ込めやすいため、通常はお勧めできません。ただし、この場合、最新のタイムスタンプを持つディレクトリ内のファイルを簡単に提供できる他のツールは考えられません。
touch_dir() {
dir="$1"
touch --reference="$(ls -td -- "${dir}"/* | head -n 1)" -- "${dir}"
}
ディレクトリ引数を使用して実行する場合は、ディレクトリの変更時間をディレクトリ内のすべてのファイルの最新の変更時間に設定する必要があります。
ディレクトリにファイルがないか(さまざまな方法で簡単にテストできます)、最新のファイル名に改行が含まれていると失敗します。head
改行の前部分のみを取得します。
複数のディレクトリを更新するには、ループで実行できます。