我正在尝试查找所有文件名(不包括文件扩展名)相同且出现 3 次的文件。我还需要文件的完整路径。
我现在有的是
#get file without extension
alias lse="ls -1R | sed -e 's/\.[a-zA-Z]*$//'"
#print out the current dir and get files occuring 3 times
lse | sed "s;^;`pwd`/;" | sort | uniq -c | grep " 3 "
但是,这会打印pwd
我运行命令的文件夹,而不是文件的路径。
所以我尝试了find
find . -type f | sed "s#^.#$(pwd)#" | sort | uniq -c
这可以运行,但包含文件扩展名。当我尝试添加时,sed -e 's/\.[a-zA-Z]*$//'"
我收到错误,因为我不确定如何组合这两个 sed 命令,而且我似乎无法再次将管道传输到 sed?
所以我想做的是
find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'"| sort | uniq -c | grep " 3 "
但这无法运行。
答案1
第二个 sed 命令中的额外“有什么作用?
/tmp/test $ touch foo.bar foo.baz foo.foo
/tmp/test $ find . -type f | sed "s#^.#$(pwd)#" | sed -e 's/\.[a-zA-Z]*$//'| sort | uniq -c | grep " 3 "
3 /tmp/test/foo
答案2
使用一些其他概念的替代但类似的方法:
find . -type f -printf '%f\n' | sed 's/\.[[:alpha:]]*$//' |\
sort | uniq -c | awk '$1==3'
用途:
find
直接-printf
剥离前导目录。- 字符类
[:alpha:]
定义字母。这模拟了您的示例,但没有考虑以数字结尾的文件(例如.mp3
)。更改为[:alnum:]
以匹配字母和数字。查找有关字符类的更多信息以查看其他可能性。 awk
只打印计数为 3 的行(很容易更改为 ,count>=3
这似乎更合乎逻辑)。由于print
是默认操作,因此仅使用 即可实现此操作awk '$1==3'
。