Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.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 (回答)Bash SH中的find命令未按预期工作_Linux_Bash_Debian - Fatal编程技术网

Linux (回答)Bash SH中的find命令未按预期工作

Linux (回答)Bash SH中的find命令未按预期工作,linux,bash,debian,Linux,Bash,Debian,我有下面这样的脚本,它应该使用'find'将所有以扩展名结尾的文件(在我给出的列表中)复制到目标目录。但是,它不起作用。我试图将“find”开头的行中的“to”“to”“,”“,”“,”“,”“”更改为“find”,但仍然没有成功。 请你帮我看一下,看看我的编码出了什么问题,非常感谢 #!/bin/bash vDirIn=/IN/ vDirOut=/OUT/ vAction="Copy" vExtn="avi,mkv,mp4" vExtnArr=($(echo "$vExtn" | tr

我有下面这样的脚本,它应该使用'find'将所有以扩展名结尾的文件(在我给出的列表中)复制到目标目录。但是,它不起作用。我试图将“find”开头的行中的“to”“to”“,”“,”“,”“,”“”更改为“find”,但仍然没有成功。 请你帮我看一下,看看我的编码出了什么问题,非常感谢

#!/bin/bash

vDirIn=/IN/
vDirOut=/OUT/
vAction="Copy"

vExtn="avi,mkv,mp4"

vExtnArr=($(echo "$vExtn" | tr ',' '\n'))

for vExtnArr_i in "${!vExtnArr[@]}"
do
    echo "$vExtnArr_i: ${vExtnArr[vExtnArr_i]}"

    if [ "$vAction" == "Copy" ]
    then
       find "$vDirIn" -name '*.${vExtnArr[vExtnArr_i]' -exec cp -rf {} $vDirOut \;
    else
       find "$vDirIn" -name '*.${vExtnArr[vExtnArr_i]' -exec mv -f {} $vDirOut \;
    fi

done
这是调试消息,这就是为什么我在“查找”行不断更改。输出像我想的那样有趣

bash -x ./CopyMediaFiles.sh
+++ readlink -f ./CopyMediaFiles.sh
++ dirname '/CopyMediaFiles.sh'
+ vPGMDir='/'
+ date
+ vDirIn=/IN/
+ vDirOut=/OUT/
+ vAction=Copy
+ vExtn=avi,mkv,mp4
+ vExtnArr=($(echo "$vExtn" | tr ',' '\n'))
++ tr , '\n'
++ echo avi,mkv,mp4
+ for vExtnArr_i in '"${!vExtnArr[@]}"'
+ echo '0: avi'
0: avi
+ '[' Copy == Copy ']'
+ find /IN/ -name '*.${vExtnArr[vExtnArr_i]' -exec cp -rf '{}' /OUT/ ';'
+ for vExtnArr_i in '"${!vExtnArr[@]}"'
+ echo '1: mkv'
1: mkv
+ '[' Copy == Copy ']'
+ find /IN/ -name '*.${vExtnArr[vExtnArr_i]' -exec cp -rf '{}' /OUT/ ';'
+ for vExtnArr_i in '"${!vExtnArr[@]}"'
+ echo '2: mp4'
2: mp4
+ '[' Copy == Copy ']'
+ find /IN/ -name '*.${vExtnArr[vExtnArr_i]' -exec cp -rf '{}' /OUT/ ';'
+ for vExtnArr_i in '"${!vExtnArr[@]}"'

find命令中是否缺少
}

-name '*.${vExtnArr[vExtnArr_i]' 
应该是这个吗

-name "*.${vExtnArr[vExtnArr_i]}"

数组引用周围的单引号对find命令无效-需要使用双引号。i、 例如,
'*.${vExtnArr[vExtnArr_i]
将只是那个字符串,而不是您试图查找的扩展名。当您只需要这些值时,为什么要在
vExtnArr
中迭代名称?而且您可以通过适当的扩展(例如
find\(-name\*.${vExtn//,/-name\*})避免循环-print0 | xargs-0 mv-t“$vDirOut”
)。令人惊讶的是……Bash的人会爬到一起,成为第一个回答关于命令使用的离题问题的人。但是当出现实际的脚本问题时-完成调试会话-他们不会回答,而是投反对票…@Petesh你说得对,谢谢,我也错过了}根据我的命令,这两个引起了问题,非常感谢。@TobySpeight,这很好,现在我知道脚本可以用这种方式编写谢谢。你说得对,非常感谢,而且我还将“改为”,它现在可以工作了:)
#!/bin/bash

vDirIn=/IN/
vDirOut=/OUT/
vAction="Copy"

vExtn="avi,mkv,mp4"

vExtnArr=($(echo "$vExtn" | tr ',' '\n'))

for vExtnArr_i in "${!vExtnArr[@]}"
do
echo "$vExtnArr_i: ${vExtnArr[vExtnArr_i]}"

if [ "$vAction" == "Copy" ]
then
   find "$vDirIn" -name "*.${vExtnArr[vExtnArr_i]}" -exec cp -rf {} $vDirOut \;
else
   find "$vDirIn" -name "*.${vExtnArr[vExtnArr_i]}" -exec mv -f {} $vDirOut \;
    fi

done