Linux (回答)Bash SH中的find命令未按预期工作
我有下面这样的脚本,它应该使用'find'将所有以扩展名结尾的文件(在我给出的列表中)复制到目标目录。但是,它不起作用。我试图将“find”开头的行中的“to”“to”“,”“,”“,”“,”“”更改为“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
#!/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