我需要你的幫助
我有一個包含數百萬個檔案的巨大目錄,我試圖使用 find 命令按年和月對這些檔案進行分組,然后將其壓縮以節省一些空間。
我創建了一個如下所示的 bash 腳本
#!/bin/bash
DIR=/data/historical
/usr/bin/cd /data/backupfile
sleep 2
[ -e "$DIR" ] || mkdir "$DIR"
sleep 2
for year in 2019 2020 2021 2022
do
for month in jan feb mar apr may jun jul aug sept oct nov dec
do
mkdir -p /data/historical/"$year"/"$month"
done
for prev feb mar apr may jun jul aug sept oct nov dec jan
do
/usr/bin/find ! -newermt "$prev 31 $year" -newermt "$month 1 $year" -exec mv {} /data/historical/"$month" \;
done
done
也嘗試過這種方式
years=2019,2020,2021,2022
months=01,02,03,04,05,06,07,08,09,10,11,12
#months=`date ' %b'`
#after=`date -d '1 month' ' %b'`
for year in $(echo ${years})
do
for month in "${months[@]}"
do
/usr/bin/find ! -newermt "$year-$month-31" -newermt "$year-$month-01" -exec mv {} /data/historical/"$month" \;
done
done
所以,這就是我真正需要的。我需要從 2019 年開始每年(2019 2020 2021 2022)和每個月(01,02,03,04,05,06,07,08,09,10,11,12)從 01 ... 12,獲取按月-年分組的檔案,然后對其進行壓縮,它們會在另一年(即 2020 年)中不斷迭代。
例如:
/usr/bin/找到!-newermt "2019 年 2 月 29 日" -newermt "2019 年 1 月 1 日" -exec mv {} /data/historical/2019 ; && /usr/bin/tar -czf /data/historical/file.tar.gz /data/historical/2019
我試過更改變數,玩迭代和 for 回圈,嵌套 for 回圈。目錄 2019/{jan...dec} 已創建,但我要搜索并按月和年分組的檔案不存在。
#編輯
為了幫助您更好地理解:
我的大檔案是 /data/backupfile
它包含 2019-2022 年的檔案
我想按年/月對這些檔案進行分組,這就是為什么我要嘗試創建目錄 2019/Jan 并從 /data/backupfile 中獲取那些 2019 年 1 月、2019 年 2 月等檔案的原因。
我一直在嘗試使用嵌套回圈來做到這一點。也許有更好的解決方案?
uj5u.com熱心網友回復:
如果你安裝了 GNU findutils,這應該可以正常作業:
cd /data/backupfile
find -type f -printf '%p/%TY/%Tb\0' |
xargs -0 sh -c '
for args; do
src=${args%/*/*}
dst=/data/historical${args#"$src"}
echo mkdir -p "$dst" &&
echo mv "$src" "$dst"
done' sh
echo如果您對輸出感到滿意,請洗掉兩個s。
uj5u.com熱心網友回復:
好的,所以你需要重新學習 globbing 和 word splitting 是如何作業的,它在 bash 中有點違反直覺,所以我可以理解其中的困難。回答你的問題:
years="$(echo {2019..2022})"
歲月就是你想要的。
幾個月參考這個:https ://unix.stackexchange.com/questions/480806/how-to-generate-list-of-months-using-bash
months="$(locale mon | tr ';' ' ')"
你的 for 回圈也應該改變:
#ENSURE IFS IS PROPERLY SET
IFS=$' \t\n'
for year in ${years}
do
for month in ${month}
do
# Find statement here.
done
done
嵌套回圈中的實際邏輯令人困惑,要查找檔案,請執行以下操作:
files="$(grep -i "${year}-${month}" "/data/backupfile")"
在那之后,我不明白你想要什么。
如果您想對找到的檔案進行壓縮,請執行以下操作:
(IFS=$'\n'; tar -czvf "${year}-${month}.tar.gz" ${files[*]})
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/535933.html
標籤:Linux狂欢壳嵌套循环
