Regex 查找没有特定扩展名的文件

Regex 查找没有特定扩展名的文件,regex,unix,Regex,Unix,有谁能帮我用一个正则表达式来查找没有.tar.gz扩展名的文件吗 我需要它在我的unix脚本中工作 for i in <REGEX for non tar.gx files> do something done 中的i 做 某物 完成 谢谢决不,决不,决不使用正则表达式执行“匹配每个不匹配Y的X”任务。相反,对X使用普通正则表达式并对结果求反 (在shell表达式中,用!=替换=,或者使用grep-v。在Perl中,使用!~而不是=。在JQuery中,使用:not操作符等。如果您

有谁能帮我用一个正则表达式来查找没有.tar.gz扩展名的文件吗

我需要它在我的unix脚本中工作

for i in <REGEX for non tar.gx files>
do
something
done
中的i
做
某物
完成

谢谢

决不,决不,决不使用正则表达式执行“匹配每个不匹配Y的X”任务。相反,对X使用普通正则表达式并对结果求反

(在shell表达式中,用
!=
替换
=
,或者使用
grep-v
。在Perl中,使用
!~
而不是
=
。在JQuery中,使用
:not
操作符等。如果您的API只允许您指定一个正则表达式,请使用Chomsky的层次结构击败供应商。)正式语言。)


补充正则表达式总是效率低下、不可读或特定于引擎——通常都是上述情况。只要对滥用正则表达式说“不”,就可以为他们擅长的任务使用工具!

决不,决不,决不在任务“匹配每一个不匹配的X”中使用正则表达式。相反,将平凡的正则表达式用于X并否定结果

(在shell表达式中,用
!=
替换
=
,或者使用
grep-v
。在Perl中,使用
!~
而不是
=
。在JQuery中,使用
:not
操作符等。如果您的API只允许您指定一个正则表达式,请使用Chomsky的层次结构击败供应商。)正式语言。)


补充正则表达式总是效率低下、不可读或特定于引擎——通常都是上述情况。只要对滥用正则表达式说“不”,就可以使用它们擅长的工具!

在bash中,打开extglob(这似乎是默认设置),您可以使用
!()
来否定全局表达式。因此:

for i in !(*.tar.gz)
do
    something
done

如果要匹配两个glob,可以在*.tar.gz*~中为i编写
。同样,如果要匹配既不是gzip存档文件也不是备份文件的所有文件,也可以在*.tar.gz*~)中为i编写

在bash中,启用extglob(似乎是默认设置)后,可以使用
()
。因此:

for i in !(*.tar.gz)
do
    something
done

如果您想匹配两个glob,您可以在*.tar.gz*~
中为i编写
。同样,如果您想匹配既不是gzip存档文件也不是备份文件的所有文件,您可以在!(*.tar.gz*~)中为i编写

如果您不想使用扩展globing,您还可以包括一个简单的测试:

for file in *
do
    if [[ $file != *.tar.gz ]]
    then
        something
    fi
done

如果您不想使用扩展的globbing,还可以包括一个简单的测试:

for file in *
do
    if [[ $file != *.tar.gz ]]
    then
        something
    fi
done
另一种可能性(说明了一种经常被忽视的技术)是:

ls | grep -v 'pdf$'|while read i; do echo "i=$i"; done
对于这个特殊的问题,这是一个非常棘手的问题,但是如果您需要使用一组具有稍微复杂的选择条件的文件来做一些事情,这会很快得到回报

它可以在任何类似sh的外壳中工作。

另一种可能性(这说明了一种经常被忽视的技术)是:

ls | grep -v 'pdf$'|while read i; do echo "i=$i"; done
对于这个特殊的问题,这是一个非常棘手的问题,但是如果您需要使用一组具有稍微复杂的选择条件的文件来做一些事情,这会很快得到回报


它可以在任何类似sh的shell中工作。

您也可以使用
查找

find . -type f -not -iname "*.tar.gz"

您也可以使用
find

find . -type f -not -iname "*.tar.gz"

请注意,
对于blah中的i
不使用正则表达式,它使用shell路径名扩展。请注意,
对于blah中的i
不使用正则表达式,它使用shell路径名扩展。但是对于带有控制字符的文件名,它会失败,因为
ls
尝试对其进行清理。如果文件名带有控制字符,则为True如果您的文件名中包含控制字符,则可能会出现其他问题(不一定是专门的技术问题),但它在包含控制字符的文件名上失败,因为
ls
尝试对其进行清理。是的,但如果您的文件名中包含控制字符,则可能会出现其他问题(不一定是专门的技术问题)