Linux 编译没有特定子字符串的文件

Linux 编译没有特定子字符串的文件,linux,bash,shell,Linux,Bash,Shell,我是bash新手,我想知道如何在某个目录中编译名称中不包含特定字符串的文件。假设我在目录中有gumbo.java jackson.java roosevelt.java roar.java文件。如何编译名称中不包含roar或gumbo的文件?在bash中,可以使用如下扩展glob模式: shopt -s extglob nullglob printf '%s\n' !(roar|gumbo).java 这与以.java结尾的咆哮或秋葵以外的任何内容都匹配。你可以把它想象成*.java,减去ro

我是bash新手,我想知道如何在某个目录中编译名称中不包含特定字符串的文件。假设我在目录中有gumbo.java jackson.java roosevelt.java roar.java文件。如何编译名称中不包含roar或gumbo的文件?

在bash中,可以使用如下扩展glob模式:

shopt -s extglob nullglob
printf '%s\n' !(roar|gumbo).java
这与以
.java
结尾的
咆哮
秋葵
以外的任何内容都匹配。你可以把它想象成
*.java
,减去
roar.java
gumbo.java

如果您对输出满意,可以用
printf
替换编译时使用的任何内容

如果要否定包含这些子字符串的任何内容,可以添加一些星号:

printf '%s\n' !(*@(roar|gumbo)*).java
@()
匹配任何一个管道分隔选项。和以前一样,整个事情都被
否定了!()


正如评论中所建议的那样,我还启用了
nullglob
,以便空匹配扩展为空。

尝试使用find命令:

find . -type f -not -name '*roar*' -and -not -name '*gumbo*' -exec <command> {} \;

我将使用标准循环:

for file in *.java; do
  case $file in
  *roar*|*gumbo*) continue;;
  *) javac "$file";;
  esac
done

如果文件是roarow.java,那么即使roar是一个子字符串,它也不会被忽略。
!(*roar*|*gumbo*).java
否则使用find
find-maxdepth 0-名称“*.java”\-名称“*roar*.java”\-名称'*gumbo*.java'-exec printf'%s\n'{}+
@Nahuel我认为它比这更复杂,因为
*
需要optional@TomFenech,没有,因为
*
匹配空字符串,但是
@()
是个好主意,可以保存2个
*
@Nahuel您的
*
是对的,谢谢,我编辑过。
for file in *.java; do
  case $file in
  *roar*|*gumbo*) continue;;
  *) javac "$file";;
  esac
done