【发布时间】:2023-03-20 09:10:01
【问题描述】:
有没有很好的regex 来查找所有不包含某个字符的文件?我知道有很多可以找到包含匹配项的行,但我想要一些能够找到所有不包含我的匹配项的文件。
【问题讨论】:
有没有很好的regex 来查找所有不包含某个字符的文件?我知道有很多可以找到包含匹配项的行,但我想要一些能够找到所有不包含我的匹配项的文件。
【问题讨论】:
对于 bash - 列出目录中的所有文件-:
shopt -s extglob
ls !(*.*)
需要 extglob 设置才能启用!这否定了 ls.
的 . 参数【讨论】:
ls,创建一个数组:no_ext_files=(!(*.*)); num="${#no_ext_files[@]}"
使用ls 和sed 将所有没有扩展名(即不包含.)的文件名替换为NoExtension:
ls | sed -e 's/^[^.]*$/NoExtension/g'
用扩展名替换具有扩展名的文件名:
ls | sed -e 's/^[^.]*$/NoExtension/g' -e 's/.*\.\(.*\)/\1/'
【讨论】:
sort | uniq -c | sort -n 附加到最后一个命令以获得排序计数。更短的 sed 替代方案:/\./! s/$/.NoExtension/; s/.*\.//.
还有一个 awk 解决方案,很好衡量。
ls | awk '$0 !~ /\..+$/{a++}END{print a}'
【讨论】:
ls | awk '!/\..+$/' 但您不想完全解析 ls 的输出。
这可能对你有用(查找、GNU sed 和 wc):
find . -type f | sed -rn '\|.*/\.?[^.]+$|w NoExtensions' && wc -l NoExtensions
这会给你一个计数和一个列表。
注意包含dot 没有扩展名的文件。
【讨论】:
您应该丢弃所有解析ls 输出的答案,阅读here 了解原因。工具find 非常适合。
# Show files in cwd
$ ls
file file.txt
# Find the files with an extension
$ find -type f -regex '.*/.*\..*$'
./file.txt
# Invert the match using the -not option
$ find -type f -not -regex '.*/.*\..*$'
./file
【讨论】: