在“查找”中增加值不起作用

在“查找”中增加值不起作用

我有一个 bash 文件,它对具有给定名称的文件进行全局更新。我已经使用这个脚本几十年了,没有任何问题。我很好奇有多少文件正在更新,并添加了一个在每次更新后递增的变量。然而,即使它正在更新文件,变量“CNT”总是报告没有更新文件。

我正在使用建议的“inc”网站。 我究竟做错了什么?

谢谢您的帮助 :-)

#!/usr/bin/bash

SEARCH=test.txt  # file name to search for
SOURCE=test.txt  # file name to replace it
CNT=0;           # number of files updated

find ./ -name "$SEARCH" | while read f; do
  cp "$SOURCE" "$f" > /dev/null 2>&1; # copy and don't show errors
  ((CNT=CNT+1))
done;   # end of while

echo -en "\n"
echo -en "$CNT files where replaced.\n"

我也尝试按照建议使用它,但无论在各种语法中插入“inc”还是“wc”(字数),都没有发现任何区别。

shopt -s lastpipe
find . -name "$search" -type f -exec 'bash
for f; do
  cp "$f" "$source"
done' sh {} +

根据 Kamil Maciorowski 提供的链接(见下文),在“find”中创建了子 shell。也许更好的问题是“如何计算 find 循环的次数?”


解决方案: 添加“shopt -s lastpipe”修复了第一个脚本,但是建议的第二个脚本仍然无法与“shopt -s lastpipe”一起使用。

答案1

问题在于while位于管道 右侧的单独私有作用域中|。一个简单的解决方案是翻转whilefind以移除管道,如下所示:

#!/usr/bin/bash

SEARCH=test.txt  # file name to search for
SOURCE=test.txt  # file name to replace it
CNT=0;           # number of files updated

while read f; do
  cp "$SOURCE" "$f" > /dev/null 2>&1; # copy and don't show errors
  ((CNT=CNT+1))
done <<<"$(find ./ -name "$SEARCH")";   # end of while

echo -en "\n"
echo -en "$CNT files where replaced.\n"

相关内容