get 命令列 perl 命令來報告它所做的更改

get 命令列 perl 命令來報告它所做的更改

我正在使用以下命令(在 Solaris 上)從一堆文件中刪除協定。

find .  -name "*.txt"  -exec perl -pi  -e 's/http//g' '{}' \;

有沒有辦法獲得詳細輸出,以便我可以獲得哪些文件已被編輯的報告?

謝謝,安迪

答案1

您可以使用以下命令來取得每個檔案的替換計數:

find . -type f -exec perl -pi -e '
    $count{$ARGV} += s/http//g;
    END {for (keys %count) {print "$_: $count{$_}\n" if $count{$_}}}' {} +

請注意,在該解決方案和原始解決方案中,perl無論是否進行替換,都會重寫文件。

不要使用;來終止-exec命令。perl一次可以處理多個文件,無需為每個文件呼叫一個 perl。

如果您只想輸出而不實際進行替換,只需在上面的命令中替換-pi為 即可。-n

你還可以這樣做:

find . -type f -exec grep -c http /dev/null {} +

為了得到一個計數包含http(不一定與出現次數相同http)。

答案2

-print您可以使用和獲取有關發送到 perl 的文件的報告-exec

find .  -name "*.txt" -print -exec perl -pi  -e 's/http//g' '{}' \;

如果你想找出哪些文件被修改了,那麼類似

find .  -name "*.txt" \
    -exec perl -i.bak -pe 's/http//g' '{}' \; \
    -exec sh -c 'cmp -s "$1" "$1.bak" && echo "$1" || rm "$1.bak"' _ '{}' \;

相關內容