簡體   English   中英

遍歷用於bash find命令的模式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM