linux - Bash 查找和表达

标签 linux bash find

有什么办法可以让它发挥作用吗?

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/

相关文章:

linux - 无法使用 pip 下载 mongo-connector

在 Linux for Mac 上交叉编译简单的标准 C 程序

具有空变量的 Bash 算术扩展行为

linux - 形式参数使用...是什么意思

c - 为什么这个用于列出目录的 C 代码不起作用?

bash - 替换最多第 n 个匹配项

linux - 需要在 wsdl - grep/awk/sed 上匹配确切的句子

c++ - 从反向迭代器获取 vector 中的索引

linux - 将 'git status' 和 find 命令与 mmin 或 mtime 选项结合起来

linux - 为什么 find 的 -exec 选项包含 'non-matched' 项?