我有一個目錄,其中包含每天都會出現的檔案。現在我想按日期分組這些文件。無論如何,是否可以將同一日期登陸的文件分組/列出。
假設目錄中有以下文件
-rw-r--r--. 1 anirban anirban 1598 Oct 14 07:19 hello.txt
-rw-r--r--. 1 anirban anirban 1248 Oct 14 07:21 world.txt
-rw-rw-r--. 1 anirban anirban 659758 Oct 14 11:55 a
-rw-rw-r--. 1 anirban anirban 9121 Oct 18 07:37 b.csv
-rw-r--r--. 1 anirban anirban 196 Oct 20 08:46 go.xls
-rw-r--r--. 1 anirban anirban 1698 Oct 20 08:52 purge.sh
-rw-r--r--. 1 anirban anirban 47838 Oct 21 08:05 code.java
-rw-rw-r--. 1 anirban anirban 9446406 Oct 24 05:51 cron
-rw-rw-r--. 1 anirban anirban 532570 Oct 24 05:57 my.txt
drwxrwsr-x. 2 anirban anirban 67 Oct 25 05:05 look_around.py
-rw-rw-r--. 1 anirban anirban 44525 Oct 26 17:23 failed.log
因此,無法使用任何後綴/前綴對文件進行分組,因為所有文件都是唯一的。現在,當我運行我正在尋找的命令時,我將根據日期分組以獲得如下一組行。
[ [hello.txt world.txt a] [b.csv] [go.xls purge.sh] [code.java] ... ] and so on.
有了這個列表,我將循環瀏覽並存檔
tar -zvcf Oct_14.tar.gz hello.txt world.txt a
答案1
對於zsh
,使用關聯數組,其鍵是日期,值是在該日期最後修改的檔案的 NUL 分隔清單:
zmodload -F zsh/stat b:zstat
typeset -A files
for file (./*) {
zstat -LA date -F %b_%d +mtime $file &&
files[$date]+=$file$'\0'
}
for date (${(k)files})
echo tar zcvf $date.tar.gz ${(0)files[$date]}
高興的時候去掉echo
。
請注意,月份名稱縮寫(%b
strftime 格式)將採用目前區域設定的語言(Oct
在英語系統、Okt
德語系統等)。若要始終使其為英文名稱,無論使用者的區域設定如何,請強制區域設定C
為LC_ALL=C zstat...
.
使用 GNU 工具,您可以執行以下操作:
find . ! -name . -prune ! -name '.*' -printf '%Tb_%Td:%p\0' |
awk -v RS='\0' -F : -v q=\' '
function quote(s) {
gsub(q, q "\\" q q, s)
return q s q
}
{
date=$1
sub(/[^:]*:/, "", $0)
files[date] = files[date] " " quote($0)
}
END {
for (date in files)
print "tar zcvf " quote(date ".tar.gz") files[date]
}'
高興的時候就吹sh
。
答案2
while read date a b filename; do
zip -g ../$date.zip "$filename"
done <<< $(stat -c "%y %n" *)
答案3
可能我誤解了這個問題,但是
ls -ls |grep '10 月 26 日' > oct26.list
將給出10月26日的文件清單;可以透過使用額外的 grep "| grep 09:" 等來完成相同的操作,例如幾個小時。