查找并隐藏文件扩展名

查找并隐藏文件扩展名

我正在尝试查找所有文件名(不包括文件扩展名)相同且出现 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'

相关内容