Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux find命令没有';行不通_Linux_Bash_Find - Fatal编程技术网

Linux find命令没有';行不通

Linux find命令没有';行不通,linux,bash,find,Linux,Bash,Find,我尝试使用find查找和复制文件,但使用file中的参数 #!/bin/bash function copyFiles(){ echo "find $1 -name $2 -exec cp "{}" $3 \;" find $1 -name $2 find $1 -name $2 -exec cp "{}" $3 \; } FILECONFIG="/home/backupScript/pathConfig.txt" DIRDATE=$(date '+%Y-%m-%d

我尝试使用find查找和复制文件,但使用file中的参数

#!/bin/bash

function copyFiles(){
    echo "find $1 -name $2 -exec cp "{}" $3 \;"
    find $1 -name $2
    find $1 -name $2 -exec cp "{}" $3 \;
}


FILECONFIG="/home/backupScript/pathConfig.txt"
DIRDATE=$(date '+%Y-%m-%d');
DIRSCRIPTS="/home/backupScript/"

while IFS='' read -r line || [[ -n "$line" ]]; do
        #echo "Text read from file: $line"
    set -- "$line"
    IFS=","; declare -a ELEMENT=($*)

    DAT1="${ELEMENT[0]}"
    DAT2=""${ELEMENT[1]}""
    DAT3="${ELEMENT[2]}"
    PATHTO=${ELEMENT[2]}/$DIRDATE/
    if [ ! -d $PATHTO ]; then
        mkdir $PATHTO;
    fi
    echo "$DAT2"
    copyFiles $DAT1 $DAT2 $DAT3
    find $DAT1 -name "$DAT2" -exec cp "{}" $DAT3 \;


done < "$FILECONFIG"



FILECONFIG="/home/backupScript/pathConfig.txt"
DIRDATE=$(date '+%Y-%m-%d');
DIRSCRIPTS="/home/backupScript/"

while IFS='' read -r line || [[ -n "$line" ]]; do
        #echo "Text read from file: $line"
    set -- "$line"
    IFS=","; declare -a ELEMENT=($*)

    DAT1="${ELEMENT[0]}"
    DAT2=""${ELEMENT[1]}""
    DAT3="${ELEMENT[2]}"
    PATHTO=${ELEMENT[2]}/$DIRDATE/
    if [ ! -d $PATHTO ]; then
        mkdir $PATHTO;
    fi
    echo "$DAT2"
    copyFiles $DAT1 $DAT2 $DAT3
    find $DAT1 -name "$DAT2" -exec cp "{}" $DAT3 \;


done < "$FILECONFIG"
#/bin/bash
函数copyFiles(){
echo“find$1-name$2-exec cp”{}“$3\;”
查找$1-命名$2
查找$1-name$2-execcp“{}”$3\;
}
FILECONFIG=“/home/backupScript/pathConfig.txt”
DIRDATE=$(日期'+%Y-%m-%d');
DIRSCRIPTS=“/home/backupScript/”
而IFS=''读-r行| |[[-n“$line”];做
#echo“从文件读取的文本:$line”
设置--“$line”
IFS=“,”;声明-a元素=($*)
DAT1=“${ELEMENT[0]}”
DAT2=“${ELEMENT[1]}”
DAT3=“${ELEMENT[2]}”
PATHTO=${ELEMENT[2]}/$DIRDATE/
如果[!-d$PATHTO];然后
mkdir$PATHTO;
fi
回显“$DAT2”
复制文件$DAT1$DAT2$DAT3
查找$DAT1-名称“$DAT2”-exec cp“{}”$DAT3\;
完成<“$FILECONFIG”
FILECONFIG=“/home/backupScript/pathConfig.txt”
DIRDATE=$(日期'+%Y-%m-%d');
DIRSCRIPTS=“/home/backupScript/”
而IFS=''读-r行| |[[-n“$line”];做
#echo“从文件读取的文本:$line”
设置--“$line”
IFS=“,”;声明-a元素=($*)
DAT1=“${ELEMENT[0]}”
DAT2=“${ELEMENT[1]}”
DAT3=“${ELEMENT[2]}”
PATHTO=${ELEMENT[2]}/$DIRDATE/
如果[!-d$PATHTO];然后
mkdir$PATHTO;
fi
回显“$DAT2”
复制文件$DAT1$DAT2$DAT3
查找$DAT1-名称“$DAT2”-exec cp“{}”$DAT3\;
完成<“$FILECONFIG”
我的文件pathConfig.txt中唯一的一行是:

/root/test/,'*.txt',/home/bucket/backupDev/test

当我运行它时。它确实管用,但很努力 find/root/test/-name'*.txt'-exec cp{}/home/bucket/backupDev/test\;than是我脚本中的一个输出。
在终端中,它的工作是最后一行。

问题是
路径配置文件中
'*.txt'
周围的引号。这将使
find
命令仅匹配以
字符开头和结尾的名称。展开变量后不会处理引号,而是直接将引号插入命令行

因此,将文件中的行更改为:

/root/test/,*.txt,/home/bucket/backupDev/test
不过,在使用变量时,应该引用它们

#!/bin/bash

function copyFiles(){
    echo "find $1 -name $2 -exec cp "{}" $3 \;"
    find "$1" -name "$2" -print -exec cp "{}" "$3" \;
}


FILECONFIG="/home/backupScript/pathConfig.txt"
DIRDATE=$(date '+%Y-%m-%d');
DIRSCRIPTS="/home/backupScript/"

while IFS='' read -r line || [[ -n "$line" ]]; do
        #echo "Text read from file: $line"
    set -- "$line"
    IFS=","; declare -a ELEMENT=($*)

    DAT1="${ELEMENT[0]}"
    DAT2="${ELEMENT[1]}"
    DAT3="${ELEMENT[2]}"
    PATHTO=${ELEMENT[2]}/$DIRDATE/
    if [ ! -d "$PATHTO" ]; then
        mkdir "$PATHTO";
    fi
    echo "$DAT2"
    copyFiles "$DAT1" "$DAT2" "$DAT3"
    find "$DAT1" -name "$DAT2" -exec cp "{}" "$DAT3" \;


done < "$FILECONFIG"
#/bin/bash
函数copyFiles(){
echo“find$1-name$2-exec cp”{}“$3\;”
查找“$1”-名称“$2”-print-exec cp”{}“$3”\;
}
FILECONFIG=“/home/backupScript/pathConfig.txt”
DIRDATE=$(日期'+%Y-%m-%d');
DIRSCRIPTS=“/home/backupScript/”
而IFS=''读-r行| |[[-n“$line”];做
#echo“从文件读取的文本:$line”
设置--“$line”
IFS=“,”;声明-a元素=($*)
DAT1=“${ELEMENT[0]}”
DAT2=“${ELEMENT[1]}”
DAT3=“${ELEMENT[2]}”
PATHTO=${ELEMENT[2]}/$DIRDATE/
如果[!-d“$PATHTO”];然后
mkdir“$PATHTO”;
fi
回显“$DAT2”
复制文件“$DAT1”$DAT2“$DAT3”
查找“$DAT1”-名称“$DAT2”-exec cp”{}“$DAT3”\;
完成<“$FILECONFIG”

如果您对
find
有疑问,为什么您需要不止一行代码(只需调用
find
)?有关构建最小复制器的指导,请参阅和。
find命令不起作用
不是适当的问题主题。只要你不能证明它没有按照手册所描述的那样工作,让我们假设它可以工作,但你使用它的方式是错误的……而这段代码有很多错误。我建议把它通读一遍。此外,您可能会考虑到在流中唯一安全地用来定义UNIX路径名的字符是Nuls,因为任何其他字符(包括逗号和换行符)都可以存在于文件名内。为什么在代码< > DAT2赋值中双倍引号?为什么不在IFS=,read-r DAT1 DAT2 DAT3
时使用