
我正在使用以下命令(在 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"' _ '{}' \;