Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
423 views
in Technique[技术] by (71.8m points)

bash - How to exclude files from list

I have ~100k files in directory. I need to delete some of them files excluding list of(15k different pattern) pattern:

Directory: /20210111/
Example files: 
/20210111/xxx_yyy_zzz.zip
/20210111/aaa_bbb_ccc.zip
/20210111/ddd_eee_fff.zip
...

Exclude.list 
ddd
aaa
...

I tried with find:

find /20210111/ -type f -iname "*.zip" ! -iname "*$(cat Exclude.list)*" -exec ...

Getting error: arguments too long. Because exclude.list have a lot of lines.

How can I do that?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can use grep to filter the output of find, then use xargs to process the resulting list.

find /20210111/ -type f -iname '*.zip' -print0 
| grep -zvFf Exclude.list - 
| xargs -0 rm
  • The -print0, -z, and -0 are used to separate the filenames by the null byte, so filenames can contain any valid character (you can't store patterns containing literal newlines in your Exclude.list, anyway).
  • grep's -F interprets the patterns as fixed strings instead of regexes.

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...