使用标准输入重定向以交互方式删除循环中的文件

使用标准输入重定向以交互方式删除循环中的文件

我需要以交互方式(即rm -i)删除存储在变量中的文件$to_remove(每行一个路径)。不幸的是,我的代码不起作用,因为标准输入已被重定向使用<<< "$to_remove"

while read -r f ; do
    rm -ir "$f"
done <<< "$to_remove"

我该如何修复它?

答案1

更新:鉴于这find是数据源,我将使用数组代替:

readarray -t to_remove < <(find ...)
number_of_files=${#toremove[@]}
rm -i "${to_remove[@]}"

如果您是 4 之前的版本bash,请使用此循环来填充数组。

while IFS= read -r fname; do
    to_remove+=("$fname")
done < <(find ...)

这些都不适用于包含换行符的文件,但我发现这种情况在可能的情况下更容易忽略,尽管在4 中,您可以完全bash省去对以下内容的调用:find

shopt -s nullglob globstar
to_remove=( "$WORKING_PATH"/**/* )

我假设您是to_remove从文件中填充的。不要那样做;直接从文件中读取。

while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< file.txt

这还使用单独的文件描述符从文件中读取,以便标准输入可以被使用rm

(如果您确实无法阅读to_remove,我只会使用一个临时文件:

printf "%s" "$to_remove" > tmp.txt
while IFS= read -r fname <&3; do
    rm -i "$fname"
done 3< tmp.txt
rm tmp.txt

答案2

我想到了。

IFS=$'\n'
for f in `echo "$to_remove"` ; do
    rm -ir "$f"
done

简洁版本:

IFS=$'\n'
rm -ir "$to_remove"

这两个版本按预期工作。


奇怪的是,下面的代码不起作用:

IFS=$'\n'
for f in "$to_remove" ; do
    rm -ir "$f"
done

为什么?

相关内容