我在脚本的参数化版本中运行以下命令:
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在目录中显示了它们,但我收到一条错误消息。
请帮助。
答案 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
等等。等等。