フォルダとその内容のバックアップを作成するスクリプトを作成しています。バックアップするフォルダ名を入力するように求められます。バックアップコピーの名前は、次の規則を使用して指定されます。元のフォルダ名_フォルダで最後に変更されたファイルの日付と時刻。スクリプトはコピーをうまく実行しますが、ファイルが最後に変更された日時を抽出する方法は混乱しています。
例は次のとおりです。
- ユーザーは、Graphiteフォルダとその内容をコピーするようにプロンプトでDocuments / Graphiteと入力します。
- Graphiteフォルダには、ファイルとファイルを含む複数のサブフォルダが含まれています。
- Graphiteフォルダとサブフォルダで最後に変更されたファイルの名前はindex.jsで、日付/時刻スタンプが2020年1月28日14:28:54のサービスサブフォルダにあります。
上記の例では、スクリプトこのタスクを実行するには2つのタスクが必要です。
a) 端末は、直近に変更されたファイルに対して以下を出力します。
2020-01-28 14:28:54 ./services/index.js
b)services / index.jsファイルの最後の変更日とタイムスタンプは、次の形式の変数に保存されます2020-01-28_14-28-54
。日付/時刻を保存する目的変数に入れた理由は、コピーされたフォルダの名前を変更するために使用されるためです。
これに対する反応郵便はがき寄稿者: @Heppo, 日付: 2011 年 9 月 16 日 18:21 同様のユースケースにこれをお勧めします。
#!/bin/bash
find $1 -type f -print0 | xargs -0 stat --format '%Y :%y %n' | sort -nr | cut -d: -f2- | head
これは、2つ以上のファイルを表示し、タイムスタンプ形式が異なることを除いて、上記の要件a)に近いです。 explainshell.comにコマンドを挿入したにもかかわらず、要件a)を満たすように変更する方法がわかりません。
私はLinuxを初めて使用しているので、これら2つの要件を取得する方法についての指示をいただきありがとうございます。
答え1
Ubuntuを使用していてfind
GNUを使用できるため、このオプションを使用して最新の変更日を印刷できます-printf
。
find "$1" -type f -printf '%TY-%Tm-%Td_%TH-%TM-%TS\n' | sort -r | head -n1
次のように出力されます
2020-01-28_14-28-54.0000000000
残念ながら、秒の少数の部分を削除する必要があります。なぜなら、それがなければ秒を印刷できないからです。
lastmod=$(find "$1" -type f -printf '%TY-%Tm-%Td_%TH-%TM-%TS\n' | sort -r | head -n1)
lastmod=${lastmod%.*} # strip fractional part