[英]bash script to find all files where date in filename is newer than current date and time
我是bash的新手,因此在為此選擇正確的語法時遇到了一些麻煩。 但要點是,我需要遍歷某個目錄中的所有文件,並打印將來文件名中日期和時間所在的文件。
文件名語法如下:
2016-04-27_19EST-KST.txt
2016-04-28_02EST-MSK.txt
2016-04-28_03EST-CET.txt
2016-04-28_09EST-EST.txt
2016-04-28_10EST-CST.txt
2016-04-28_12EST-PST.txt
一天中的小時采用軍事格式,我不在乎最后的“ EST-CST”部分。
到目前為止,這是我得到的:
#!/bin/bash
curdate=$(date +%Y-%m-%d)
curtime=$(date +%H)
for fn in *.txt;do
[ "${curdate}_${curtime}*.txt" "<" "$fn" ] && continue
echo "$fn"
done
這只會返回目錄中的所有文件。 我在這里做錯了什么?
此腳本將打印名稱代表比當前日期新的所有文件:
#!/bin/bash
d="$(date +%Y-%m-%d_%HZZZ.tmp.txt)"
touch "$d"
printf "%s\n" *.txt | LC_ALL=C sort | awk -v d="$d" 'f{print} d==$0{f=1}'
rm "$d"
d="$(date +%Y-%m-%d_%HZZZ.tmp.txt)"
這將創建一個與當前時間匹配的名稱。
touch "$d"
這將創建一個名稱與當前時間匹配的文件。
printf "%s\\n" *.txt
這會將所有*.txt
文件名(每行一個)打印到stdout。
(您的文件名都具有合理的名稱。如果文件名中包含換行符,那么我們希望將此換行符分隔的列表替換為以空值分隔的列表,並對下面的代碼進行適當的更改。)
LC_ALL=C sort
這將文件名按順序排序。 我指定LC_ALL=C
以便確保順序是期望的。
此時,請注意我們在臨時文件名中使用的ZZZ
。 這樣可以確保臨時文件在當前時間之后排在所有其他文件之后。 如果要在輸出中包含當前時間的文件,則可以改用AAA
。
awk -vd="$d" 'f{print} d==$0{f=1}'
該代碼在當前時間后臨時打印所有文件名。
rm "$d"
這將刪除不再需要的臨時文件。
如果上述腳本正在執行中,則它將在目錄中保留一個雜散文件。 例如,如果在腳本運行時按下Ctrl-C,可能會發生這種情況。 為了確保始終刪除該文件,我們可以使用trap
:
#!/bin/bash
d="$(date +%Y-%m-%d_%HZZZ.tmp.txt)"
trap 'rm "$d"' EXIT
touch "$d"
printf "%s\n" *.txt | LC_ALL=C sort | awk -v d="$d" 'f{print} d==$0{f=1}'
您的解決方案很接近,但是最好使用數值比較來比較日期,並使用date
標准化日期表示,例如:
#!/bin/bash
curdate=$(date +%Y%m%d%H)
for fn in *.txt; do
tmp=${fn%%EST*} # remove timezone info, ignored
fdate=$(date -d "${tmp/_/ }" +%Y%m%d%H)
(( curdate < fdate )) && echo "$fn"
done
在某些時候,您可能需要使用awk或sed或其他方法解析日期。 您可以嘗試如下操作:
#!/bin/bash
curdate=$(date +%Y-%m-%d)
curtime=$(date +%H)
for fn in *.txt;do
date=$(echo $fn | sed 's/EST.*.txt//')
if [[ "${curdate}_${curtime}" < "$date" ]]; then
echo $fn
fi
done
注意:請記住,sed命令非常具體。 僅當文件名始終使用您發布的格式時,此選項才起作用。 您可以根據自己的需要進行調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.