我从别人那里接管了大量历史数据。然而,在我看来,文件名完全是随机的,而且格式很糟糕。
首先,我想获取包含空格或除 AZ、0-9、.、-、_ 之外的任何字符的所有文件的列表,是否有办法在 Linux 上的命令行中使用正则表达式语法来执行此操作?
答案1
find . -type f | grep -i '[^a-z0-9\.\/_\-]'
a-z
这将匹配所有包含除、0-9
、点、斜线(用于目录)、下划线或连字符减号之外的字符的文件。
笔记:这会不是如果文件(或路径)包含换行符,则有效,因为管道grep
会将文件路径分成两部分。虽然并不常见,但应该提到。
使用 Zsh 的简单解决方案(它需要setopt EXTENDED_GLOB
):
ls -l **/*[^a-zA-Z0-9-_.]##*
递归**
到目录中,并*
匹配零个或多个任意字符。白名单字符的否定模式需要匹配至少一次(##
)。
答案2
如果您有locate命令,您可以执行以下操作:
locate --basename --regex "[^0-9A-Za-z\.\_\-]"
在 centos 系统中,您可以通过运行 yum -y install updatedb 来安装locate。然后您需要运行 updatedb 命令,然后运行locate。
在此命令中,basename 强制定位仅搜索文件名而不是完整目录路径,并且 regex 在此文件名上运行给定的 reg expr。
答案3
这将突出显示奇怪的文件,但不会只打印它们:
查找 . -type f -maxdepth 1 | grep --color='auto' [[:alnum:]]