运行sh脚本的错误

时间:2015-11-09 19:58:36

标签: linux bash

我一直在运行我的脚本时出现这些错误,我无法解决这个问题......

不断出现的错误是;

rm:无法删除〜/ my-documents / article:':是一个目录。它引用的目录是2美元......这是我的脚本。

#! /bin/sh

SRC=$1
DES=$2

if [ $# -ne 2 ]; then
echo "1. Please enter the source directory"
echo "2. Please enter the destination directory"
echo "thankyou"
exit
fi


if [ ! -d $1 ]; then
echo "$1 is not a directory please enter a valid directory"
echo "thankyou"
exit
fi
#gives the user a error warning the source directory is invalid


if [ -d $2 ]; then
echo "output directory exists"
else
echo "Output directory does not exist, creating directory"
mkdir $2
fi
#creates the destination directory if one doesn't exist


IFILE=$GETFILES;
FINDFILE=$FINDFILE;


 find $1 -name "*.doc" > FINDFILE
 find $1 -name "*.pdf" > FINDFILE
 find $1 -name "*.PDF" > FINDFILE
 #finds doc, pdf & PDF files and sends data to findfile.

 while read -r line;
 do
 cp $line $2
 done < FINDFILE
 #files read and copied to destination directory

 IFILE=$2/$GETFILES;
 ls -R $1 | egrep -i ".doc | .pdf" > IFILE;

 LCOUNT=0
 DIFFCOUNT=0
 FOUND=0
 ARCHIVE=1
 BASE="${line%.*}"
 EXTENSION="${line##*.}"

COUNT=$COUNT;

ls $2 | grep ${line%%.*} \; | wc -l 

if [[ $COUNT -eq 0 ]];
then
cp $1/$line $2;
else
echo "there is already a file in the output so need to compare"
COMP=$2/$line
fi

while [[ $FOUND -eq 0 ]] && [[ $LCOUNT -lt $COUNT ]]; 
do
echo "diffcount is $DIFFCOUNT"

###compares the file from the input directory to the file in 
###the output directory 

if [ $DIFFCOUNT -eq 0 ];
then
echo "file has already been archived no action required"
FOUND=$FOUND [ $FOUND+1 ]
else
LCOUNT=$LCOUNT [ $LCOUNT+1 ]
COMP="OUT"/"$BASE"_"$LCOUNT"."$EXTENSION"
echo "line count for next compare is $LCOUNT"
echo "get the next file to compare"
echo "the comparison file is now $COMP"
fi
    if [ $LCOUNT -ne $COUNT ]; then
    ARCHIVE=$ [ $ARCHIVE+1 ]
    else
    ARCHIVE=0
    fi

    if [ $ARCHIVE -eq 0 ];
    then
    NEWOUT="OUT"/"$BASE"_"$LCOUNT"."$EXTENSION";
    echo "newfile name is $NEWOUT"
    cp $1/$LINE $NEWOUT
    fi

done < $IFILE
rm $IFILE

OFILE=$2/DOCFILES;
ls $2 | grep ".doc" > $OFILE;

while read -r line;
do

BASE=${line%.*}
EXTENSION=${line##*.}
NEWEXTENSION=".pdf"
SEARCHFILE=$BASE$NEWEXTENSION

find $2 -name "$SEARCHFILE" -exec {} \;
done < $OFILE
rm $OFILE

### this will then remove any duplicate files so only 
### individual .doc .pdf files will exist

1 个答案:

答案 0 :(得分:2)

rm的简单调用只能删除文件,而不能删除目录

$ touch /tmp/myfile
$ rm /tmp/myfile

$ mkdir /tmp/mydir
$ rm /tmp/mydir
rm: cannot remove ‘/tmp/mydir/’: Is a directory

您可以通过指定-d(删除目录)或-r(以递归方式删除目录和内容)来删除目录标志:

$ mkdir /tmp/mydir
$ rm -r /tmp/mydir
$

这在man rm中有详细描述。

除此之外,你似乎忽略了引用:

 $ rm $OFILE
如果OFILE的值包含空格,

可能会破坏,请改为使用引号

 $ rm "${OFILE}"

never parse the output of ls

 ls $2 | grep ".doc" > $OFILE

(例如,如果您的“$ 2”实际上是“/home/foo/my.doc.files/”,它会将此目录中的所有文件放入$ OFILE)。

然后你迭代这个文件的内容?

相反,只需使用带有文件循环的循环:

 for o in "${2}"/*.doc
 do
   ## loop code in here
 done

或只是使用find进行过滤(并且不要忘记使用-exex调用可执行文件):

 find "$2" -name "$SEARCHFILE" -mindepth 1 -maxdepth 1 -type f -exec convertfile \{\} \;