我需要以交互方式(即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
为什么?