-exec参数未找到求助:提取不含目录名的电影列表失败
解决
find -exec提示“Not found argument”的问题 嘿,这个报错我太熟悉了!大概率是你在用find命令的-exec选项时,语法细节没处理对——尤其是-exec的结束标记没写对,这是新手常踩的坑。
先说说错误根源
find的-exec参数要求必须用;或者+来标记命令的结束,但shell会把;当成命令分隔符,所以必须转义(写成\;)或者用单引号包裹(';')。如果漏掉这个标记,就会出现“Not found argument in -exec”的错误。
给你几个可行的解决方案
方案1:修正-exec的语法
假设你原来的命令大概是这样的(没加结束标记):
find /your/movie/path -type f -name "*.mkv" -exec basename {} > movie_list.txt
把它改成下面这样,加上转义的分号:
find /your/movie/path -type f -name "*.mkv" -exec basename {} \; > movie_list.txt
这里\;告诉find:“每个找到的文件都单独执行一次basename命令”,然后所有输出会被重定向到movie_list.txt里。
方案2:用find自带的-printf更高效
其实没必要调用外部的basename命令,find本身的-printf选项可以直接输出不含路径的文件名,既简单又高效:
find /your/movie/path -type f -name "*.mkv" -printf "%f\n" > movie_list.txt
%f是find的格式化占位符,专门用来输出“仅文件名(不含路径)”,\n用来换行,完美生成你要的无目录名电影列表。
方案3:处理带空格的文件名(进阶)
如果你的电影文件名里有空格,用-exec的时候要注意给参数加引号,避免shell把空格当成分隔符。比如可以用sh -c来包裹命令:
find /your/movie/path -type f -name "*.mkv" -exec sh -c 'basename "$1"' _ {} \; > movie_list.txt
这里的_是占位符,用来填充sh -c的$0参数,$1就是当前找到的文件,双引号能确保带空格的文件名被正确处理。
总结
最常见的问题就是-exec没加转义的结束分号,而用-printf的方案是最不容易出错的,推荐优先用这个!
内容的提问来源于stack exchange,提问作者Дмитрий Смирнов
相关产品推荐
相关产品推荐

