有什么办法可以让它发挥作用吗?
pFile= find ${destpath} (( -iname "${mFile##*/}" )) -o (( -iname "${mFile##*/}" -a -name "*[],&<>*?|\":'()[]*" )) -exec printf '.' \;| wc -c
我需要 pFile 返回具有相同文件名的文件的数量,或者如果没有,则返回 0。 我必须这样做,因为如果我只使用:
pFile= find ${destpath} -iname "${mFile##*/}" -exec printf '.' \;| wc -c
如果文件名与元字符相同则不返回。
谢谢
编辑:
“${mFile##*/}”在启动文件夹中具有输出文件名,不带路径。
echo "${mFile##*/}"-> goofy.mp3
示例 在开始文件夹中我有:
goofy.mp3 - 米奇[1].avi - 唐纳德(2).mkv - scrooge.3gp
在目标文件夹中我有:
goofy.mp3 - 米奇[1].avi -donald(2).mkv -donald(1).mkv -donald(3).mkv -minnie.iso
我想要这个:
回显 pFile -> 3
与:
pFile= find ${destpath} -iname "${mFile##*/}" -exec printf '.' \;| wc -c
回显 pFile -> 2
与:
pFile= find ${destpath} -name "*[],&<>*?|\":'()[]*" -exec printf '.' \;| wc -c
回显 pFile -> 4
使用相同的文件名我的意思是: /path1/mickey[1].avi =/path2/mickey[1].avi
最佳答案
我不确定我是否理解您的 ${mFile##*/}
的预期语义,但是查看您的开始/目标文件夹示例,我创建了以下用例目录结构和下面的脚本来解决您的问题:
$ find root -type f | sort -t'/' -k3
root/dir2/donald(1).mkv
root/dir1/donald(2).mkv
root/dir2/donald(2).mkv
root/dir2/donald(3).mkv
root/dir1/goofy.mp3
root/dir2/goofy.mp3
root/dir1/mickey[1].avi
root/dir2/mickey[1].avi
root/dir2/minnie.iso
root/dir1/scrooge.3gp
现在,以下脚本(我使用 gfind
来表明您需要 GNU find
才能使其工作,但如果您使用的是 Linux,只需使用 find
):
$ pFile=$(($(gfind root -type f -printf "%f\n" | wc -l) - $(gfind root -type f -printf "%f\n" | sort -u | wc -l)))
$ echo $pFile
3
我不确定这是否能解决您的问题,但它确实会打印您在提供的示例中期望的数字。
关于linux - Bash 查找和表达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049238/