终端中如何获取当前目录及子目录下同名文件的完整路径
终端中如何获取当前目录及子目录下同名文件的完整路径
我来帮你搞定这个问题!你之前的思路方向是对的,但卡在了xargs的用法细节和ls -R输出的小问题上,咱们一步步修正过来。
先说说你原来的命令为啥没生效:
ls -R的输出里包含了以冒号结尾的目录行(比如./subdir:),虽然最终会被sort和uniq过滤掉,但更关键的是xargs默认会把所有参数一次性传给find,而find . -name只能接收一个文件名模式,多个文件名堆在一起会导致find无法正确解析,所以得让xargs逐个处理文件名。- 另外,
ls -R在遇到带空格、换行或特殊字符的文件名时,很容易出现解析错误,这也是用ls做管道处理的常见坑。
下面给你两种可行的解决方案:
方案一:修正你原来的命令(适合快速测试)
先过滤掉ls -R输出里的目录行,再让xargs逐个处理文件名:
ls -R | grep -v ":$" | sort | uniq -d | sort -r | xargs -I {} find . -name "{}"
grep -v ":$":去掉所有以冒号结尾的目录行,只保留纯文件名xargs -I {}:让xargs把每个文件名替换到{}的位置,每次单独运行一次find . -name "{}",这样就能正确找到每个重复文件名的所有路径了
方案二:更可靠的方法(推荐,适配所有特殊文件名)
用find代替ls来遍历文件,能完美处理带空格、特殊字符的文件名:
方法A:分步处理,先找重复文件名再查路径
find . -type f -printf "%f\n" | sort | uniq -d | sort -r | while read filename; do find . -type f -name "$filename" done
find . -type f -printf "%f\n":遍历所有文件,只输出文件名(%f表示不含路径的纯文件名)while read filename:逐个读取重复的文件名,再用find查找对应的完整路径
方法B:一次遍历完成(更高效,适合文件量大的目录)
find . -type f -printf "%f:%p\n" | sort | awk -F: ' { arr[$1] = arr[$1] "\n" $2 } END { for (file in arr) { # 拆分路径数组,判断是否有多个重复文件 count = split(arr[file], paths, "\n") if (count > 2) { # 初始数组会带一个空行,所以count>2表示至少2个重复文件 print "重复文件名:" file print "路径:" arr[file] "\n" } } } '
find . -type f -printf "%f:%p\n":输出格式为文件名:完整路径- awk部分:把每个文件名对应的路径收集到数组里,最后统一输出有多个路径的文件名及对应所有路径,结果看起来更清晰
备注:内容来源于stack exchange,提问作者all2alb
相关产品推荐
相关产品推荐

