将查找更改为echo

时间:2011-11-14 01:01:04

标签: bash

这几乎是好的

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

3 个答案:

答案 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