![查找文件明确包含转义符号(如 ]、- 空格)的目录](https://linux22.com/image/1534732/%E6%9F%A5%E6%89%BE%E6%96%87%E4%BB%B6%E6%98%8E%E7%A1%AE%E5%8C%85%E5%90%AB%E8%BD%AC%E4%B9%89%E7%AC%A6%E5%8F%B7%EF%BC%88%E5%A6%82%20%5D%E3%80%81-%20%E7%A9%BA%E6%A0%BC%EF%BC%89%E7%9A%84%E7%9B%AE%E5%BD%95.png)
我有几个视频文件,其中包含转义字符,例如 [ 与 [1920x1080] 的组合。当我执行:
find /run/media/user/usbdisk -type f -iname [HD, 1920x1080] - Wild Wild West.mp4 -ls
然后我收到如下错误:
find:paths must precede expression
当我执行时
find /run/media/user/usbdisk -type f -iname "[HD, 1920x1080] - Wild Wild West.mp4" -ls
尽管我确信该文件存在,但我没有得到任何结果。
执行时结果相同(未找到任何内容):
find /run/media/user/usbdisk -type f -iname '[HD, 1920x1080] - Wild Wild West.mp4' -ls
为了接收电影的目录名称(basename),我将名称存储在名为 video 的变量中,以便我的命令最终如下所示:
dname=$(find /run/media/user/usbdisk -type f -iname "$video" -exec dirname {} \;)
但这会导致错误结果(见上文)。
我怎样才能让 find 命令(或任何其他命令)准确找到我确切命名的文件(包括转义符号)?有什么方法或有必要替换文件名中的转义符号吗?我想避免这种情况。提前谢谢您。
答案1
-iname
评估其参数,*
并且?
对其[]
具有特殊含义,因此如果您想按字面意思传递它们,则必须对它们进行转义。
-quit
如果您在不同的文件夹中找到两个或多个文件(重复?),请考虑使用。我猜您希望dname
使用单个目录名。
据我了解$video
已经给出:
video="[HD, 1920x1080] - Wild Wild West.mp4"
在这种情况下尝试:
video1=$(echo $video | sed 's|\[|\\[|g; s|\]|\\]|g')
dname=$(find /run/media/user/usbdisk -type f -iname "$video1" -exec dirname {} \; -quit)
这可以在一行中完成。为了清晰起见,我选择引入额外的变量。