我需要列出在特定年份創建的檔案,然后洗掉這些檔案。年份應該是輸入。
我嘗試了它對我有用的日期。但無法將該日期轉換為年份以進行回圈比較以獲取檔案串列。
下面的代碼給出了 05/07 檔案。但想列出在 2022、2021 等創建的檔案,
for file in /tmp/abc*txt ; do
[ "$(date -I -r "$file")" == "2022-05-07" ] && ls -lstr "$file"
done
uj5u.com熱心網友回復:
如果你最終還是這樣做ls -l 了,你可能只是從輸出中決議日期資訊。(但是,一般不要ls在腳本中使用。)
ls -ltr | awk '$8 ~ /^202[01]$/'
date -r不是便攜式的,但如果你有它,你可以做
for file in /tmp/abc*txt ; do
case $(date -I -r "$file") in
2020-* | 2021-* ) ls -l "$file";;
esac
done
(無論如何,當您列出單個檔案時, -tand-r標志沒有任何意義。)ls
如果您不這樣做,則選擇的工具是stat,但它也存在可移植性問題;獲取所需資訊的精確選項因平臺而異。在 Linux 上,嘗試
for file in /tmp/abc*txt ; do
case $(LC_ALL=C stat -c %y "$file") in
2020-* | 2021-* ) ls -l "$file";;
esac
done
在 BSD(包括 MacOS)上,嘗試stat -f %Sm -t %Y "$file"獲取剛剛的年份。
如果您需要適當的可移植性,或許可以尋找具有廣泛支持的腳本語言,例如 Perl 或 Python。stat()系統呼叫是獲取檔案元資訊的基本資源。該find命令還具有一些按年齡查找檔案的功能,盡管它的默認行為也是遍歷子目錄(您可以使用-maxdepth 1; 來禁止它,但是按年齡選擇檔案的選項又不是完全 POSIX 可移植的)。
uj5u.com熱心網友回復:
要列出在特定年份最后修改的檔案,然后洗掉這些檔案,可以使用find -newer和touch命令的組合:
# given a year as input
year=2022
stampdir=$(mktemp -d)
touch -t ${year}01010000 "$stampdir"/beginning
touch -t $((year 1))01010000 "$stampdir"/end
find /tmp -name 'abc*txt' -type f -newer "$stampdir/beginning" ! -newer "$stampdir/end" -print -delete
rm -r "$stampdir"
首先,創建一個臨時作業目錄來存放時間戳檔案;我們不希望find命令意外找到它們。這里要小心;mktemp可能會在 /tmp 中創建一個目錄;這個用例是安全的,因為我們正在命名時間戳檔案,使得它們與問題中的“abc * txt”模式不匹配。
接下來,使用以下命令創建邊界時間戳檔案touch:一個是一年中的最新日期,命名為“開始”,另一個是明年的最新日期,命名為“結束”。
然后運行find命令;這是細分:
- 從 /tmp 開始(來自問題)
- 以“abc * txt”模式命名的檔案(來自問題)
- 只有檔案(不是目錄等——來自問題)
- 比開始時間戳檔案更新
- 不比結束時間戳檔案新(即舊)
- 如果找到,列印檔案名然后洗掉它
最后,清理我們創建的臨時作業目錄。
uj5u.com熱心網友回復:
試試這個:
檢查哪些檔案被拾取:
echo -e "給出年份:"
讀年
ls -ltr /tmp | grep "^-" |grep -v ":" | grep $yr | awk -F " " '{ 列印 $9;}'
** 您可以將 { print $9 ;} 替換為 { rm $9; } 在上面的命令中洗掉選擇的檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/473078.html
上一篇:替換行之間的模式
下一篇:如何找到迭代回圈期間花費的時間?
