这几乎是好的
find *.txt -print0 | xargs -0 rm -f
我希望有类似的东西
echo *.txt ./zad3.sh | xargs -l rm -f
第一个版本很好,因为我可以删除带有空格的文件,但我无法使用我的脚本来选择要删除的文件。
第二个版本我可以选择文件,但我无法删除带有空格的文件。
我想在.txt上查找结尾的文件并删除其中一些文件。如果我同意删除它,则zad3.sh是一个返回文件名的脚本rm捕获名称并将其删除。它仅适用于没有空格和特殊字符的文件。第二个版本更好,但我不能把我的脚本放在里面。
find *.txt -print0| xargs -0 ./zad3.sh |xargs rm -f
它几乎可以工作,但我不能将arg传递给rm和我的部分代码
pick()
{
while read LINE
do
for arg in $LINE
do
echo "${arg}[tn]" >&2
read x <&2
if [ "${x}" = "t" ]; then
echo $arg
fi
done
done
}
for arg in "$@"
do
echo "${arg}[tn]" >&2
read x <&2
if [ "${x}" = "t" ]; then
echo $arg
fi
done
if [ $# = 0 ]; then
pick
fi
答案 0 :(得分:1)
我可能会做的是将zad.sh
脚本更改为仅采用单个argunment而不输出任何内容。如果文件可以删除,则返回成功(exit 0
),如果不能,则返回失败(exit 1
)。 e.g。
#!/bin/bash -u
FILE="$1"
if can_delete $FILE
then
exit 0
else
exit 1
fi
现在,您可以轻松地将shell脚本用作find命令
中的过滤器find *.txt -exec ./zad3.sh {} \; -print0 | xargs -0 rm -f
因此,zad3.sh
失败的任何文件都不会生成print0
,因此不会被删除。
答案 1 :(得分:0)
有点hacky,但是:
find -name "*.txt" -exec rm -i $( ./zad3.sh {} ) 2> /dev/null \;
这将rm
只有你的脚本回显的文件,而其他没有回复的文件将不会传递给rm
,但是stderr会尝试rm
没有文件名的1}}被重定向到/ dev / null。
另外,你想引用* .txt,否则globbing会在它到达find命令之前扩展*。
答案 2 :(得分:0)
我怀疑你想做这样的事情:
select fname in *.txt;
do
echo about to delete "$fname"
rm -v "$fname"
done
使用break退出循环;
脚本的简单演示,将继续发布要删除的新文件列表:
PS3="select file or '0' to stop? "
while ls *.txt; do
select file in *.txt; do
if [ -z "$file" ]; then break 2; fi
rm -v "$file";
break; # we want a new list
done;
done