Linux

如何根據文件的時間戳(當月的日期)將文件複製到另一個目錄?

  • July 9, 2019

假設我在 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)或類似的東西嗎?

謝謝!

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

回應您關於您的目標作業系統是 RedHat 的評論,RedHat 的stat實用程序似乎沒有 FreeBSD 所具有的格式靈活性。您可以在此處比較手冊頁。

您可能會發現該命令date -r foo "+%d"是合適的替代品。腳本的相關行將變為:

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

如果你有 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的格式化輸出 ( ) 。生成的十進制數在 01 到 31 的範圍內,並用作命令的目標。cp

引用自:https://unix.stackexchange.com/questions/529227