Linux 编译没有特定子字符串的文件
我是bash新手,我想知道如何在某个目录中编译名称中不包含特定字符串的文件。假设我在目录中有gumbo.java jackson.java roosevelt.java roar.java文件。如何编译名称中不包含roar或gumbo的文件?在bash中,可以使用如下扩展glob模式: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
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
否则使用findfind-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