[英]Looping through a pattern for use in a bash find command
我正在嘗試編寫一個簡單的bash腳本來瀏覽目錄並刪除與模式匹配的文件的所有版本(最新的2個除外)。 這個命令很好用:
find . -type f -name 'a.*.log' -printf '%T@\t%p\n' \
| sort -t $'\t' -g \
| head -n -2 \
| cut -d $'\t' -f 2- \
| xargs rm -f
這將使用以下文件:a.1.log,a.2.log和a.3.log,並刪除a.1.log(假設它是最舊的時間戳記)。 文件名的版本部分是一個哈希,因此不是按數字順序(為了簡單起見,我對其進行了更改)。
因此,我想做的是遍歷一組不同的模式,並將每個模式提供給上面的find命令。 我已將本示例的腳本簡化為如下所示:
#!/bin/bash
FILES="a.*.log
b.*.log
c.*.log"
for f in $FILES
do
echo "Processing $f"
find . -type f -name "$f"
done
我從中運行此文件的目錄包含以下文件:
a.1.log, a.2.log, a.3.log, b.1.log, b.2.log, b.3.log, c.1.log, c.2.log, c.3.log
我從上面的腳本獲得的輸出是:
Processing a.1.log ./a.1.log Processing a.2.log ./a.2.log Processing a.3.log ./a.3.log Processing b.1.log ./b.1.log Processing b.2.log ./b.2.log Processing b.3.log ./b.3.log Processing c.1.log ./c.1.log Processing c.2.log ./c.2.log Processing c.3.log ./c.3.log
我需要的是輸出看起來像這樣:
Processing a.*.log ./a.1.log ./a.2.log ./a.3.log Processing b.*.log ./b.1.log ./b.2.log ./b.3.log Processing c.*.log ./c.1.log ./c.2.log ./c.3.log
我試過使用數組而不是遍歷字符串,轉義文件模式,在查找中使用單引號或雙引號等,但是我無法用它簡單地將模式替換為查找。 如果我手動運行查找結果,它將為我提供所需的輸出:
$ find . -type f -name "a.*.log" ./a.1.log ./a.2.log ./a.3.log $ find . -type f -name "b.*.log" ./b.1.log ./b.2.log ./b.3.log $ find . -type f -name "c.*.log" ./c.1.log ./c.2.log ./c.3.log
我找不到有人通過一組模式循環並將其替換為命令的任何示例。 任何幫助都是極好的。
謝謝。
您遇到的問題是,如果不對引號變量進行拆分,但是還會發生文件混亂,可以使用shell選項noglob set -f
或使用數組並使用雙引號來避免:
files=( 'a.*.log' 'b.*.log' 'c.*.log' )
for f in "${files[@]}"; do
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.