タイムスタンプ(日付)に基づいてファイルを別のディレクトリにコピーする方法は?

タイムスタンプ(日付)に基づいてファイルを別のディレクトリにコピーする方法は?

dir1に次のファイルがあるとしましょう。

-rw-r--r--  1 user user  10240 Jul  2 11:54 10_data.txt
-rw-r--r--  1 user user  36048 Jul  4 11:56 95_data.txt
-rw-r--r--  1 user user  35634 Jul  7 11:56 01_data.txt
-rw-r--r--  1 user user  10630 Jul  9 11:56 19_data.txt
-rw-r--r--  1 user user  35476 Jul  9 11:57 93_data.txt

タイムスタンプ、特に日付(2、4、7、9)に基づいてこのファイルをコピーできるようにしたいです。

前任者:

copy 10_data.txt into a directory called 02
copy 19_data.txt into a directory called 09
copy 93_data.txt into a directory called 09

ターゲットディレクトリ(01、02、03など)がすでに存在するため、ディレクトリなどを作成する必要はありません。毎日の深夜以降にcronジョブとして実行する予定です。

findこのタスク(date +%d)や同様のタスクに使用できるものはありますか?

ありがとうございます!

答え1

zshが利用可能な場合は、次のようにしてこれを実行できます。zstatモジュール:

zmodload zsh/stat
for f in *.txt
do
  cp -p -- "$f" $(zstat -F %d +mtime "$f")/
done

このzstat -F %d +mtimeコマンドにはフォーマットされた出力(-F %d)が必要です。月の日ファイル変更時間です。結果の10進範囲は01から31までで、コマンドのターゲットとして使用されますcp

答え2

statlsファイルの変更時間、ファイルサイズ、または最も頻繁に表示されるファイルプロパティを探している友達。

たとえば、FreeBSDでは、stat -f %Sm -t %d -- fooファイルが最後に変更された日付が表示されますがfoo、これはあなたが探しているようです。

いいえ。次の例findのようにファイルを直接繰り返すことができます。bash

for f in *; do
  d=$(stat -f %Sm -t %d -- "$f")
  cp -p -- "$f" $d/
done

ターゲットOSがRedHatというあなたの意見に応じて、RedHatのユーティリティにstatはFreeBSDのフォーマット柔軟性がないようです。マンページを比較できますここ

date -r foo "+%d"このコマンドが適切な代替コマンドであることがわかります。スクリプトの関連行は次のとおりです。

  d=$(date -r "$f" "+%d")

答え3

これを試してみてください。私はそれをテストしました。働かなければならない

cp `ls -ltrh *txt  | awk '{if($7=2){print $NF}}'` `ls -ltrh *txt  | awk '{print $7}'`

2日間しか悩みませんでしたが、ディレクトリは同じパスにあります。別の日付を追加し、ディレクトリが別のフォルダである場合は、そのフォルダも追加してください。

別の仮定は、ファイル名にスペースがないことです。

関連情報