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
stat
ls
ファイルの変更時間、ファイルサイズ、または最も頻繁に表示されるファイルプロパティを探している友達。
たとえば、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日間しか悩みませんでしたが、ディレクトリは同じパスにあります。別の日付を追加し、ディレクトリが別のフォルダである場合は、そのフォルダも追加してください。
別の仮定は、ファイル名にスペースがないことです。