find命令移动文件但文件变得不可访问

时间:2011-12-16 10:34:19

标签: unix find exec ls mv

我在脚本的参数化版本中运行以下命令:

Script1为

Nooffiles=`find $1 -mmin $2 -type f -name "$3"|wc -l`
if test $Nooffiles -eq 0
then
exit 1
else
echo "Successful"
find $1 -mmin $2 -type f -name "$3" -exec mv '{}' $4 \;
fi

script1工作正常。它将文件从$ 1目录移动到$ 4。但是在将文件移动到新目录之后,我必须运行另一个这样的脚本:

Script2为

for name in `find $1 -type f -name "$2"`
do
filename=`ls $name|xargs -n1 basename`
line=`tail -1 $filename | sed "s/Z/Z|$filename/"`
echo $line >> $3;
echo $filename | xargs -n1 basename;
done

这里,script2正在从前一个脚本script1移动文件的目录中读取。它们存在于该目录中,因为上一个移动脚本工作正常。 'ls'命令显示它们。但上面的脚本2说:

File.txt: No such file or directory

尽管ls在目录中显示了它们,但我收到一条错误消息。

请帮助。

1 个答案:

答案 0 :(得分:1)

您的脚本确实很乱,请注意,您不应该解析文件名(例如ls的输出,或find没有-print0选项的输出)。请参阅Bash Pitfalls #1

除此之外,我认为问题在于,在循环中,您使用find截断basename的文件名输出,然后使用基本文件名作为参数调用tail,文件实际上不在当前文件夹中。

我不明白你在那里做了什么,但这是一些更正确的代码,可能在你想要的旁边做:

find "$1" -type f -name "$2" -print0 | while read -d '' name
do
    filename=`basename "$name"`
    tail -1 "$name" | sed "s/Z/Z|$filename/" >> "$3"
    echo "$filename"
done

但是,这个剧本还有一些陷阱。从find输入的同名文件名可能会失败。例如,如果您的文件名包含sed特有的字符。或者,如果在某个时刻$filename--help等等。等等。