我有一个 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
位于管道 右侧的单独私有作用域中|
。一个简单的解决方案是翻转while
和find
以移除管道,如下所示:
#!/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"