Exclude a sub-directory using find

前端 未结 6 1868
鱼传尺愫
鱼传尺愫 2021-01-30 18:54

I have directory structure like this

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___i         


        
相关标签:
6条回答
  • 2021-01-30 19:35

    This is what I did to exclude all the .git directories and passed it to -exec for greping something in the

    find . -not -path '*/\.*' -type f -exec grep "pattern" [] \;
    
    • -not -path '*/\.*' will exclude all the hidden directories
    • -type f will only list type file and then you can pass that to -exec or whatever you want todo
    0 讨论(0)
  • 2021-01-30 19:41

    By following answer for How to exclude a directory in find . command:

    find . \( -name ".git" -o -name "node_modules" \) -prune -o -print
    
    0 讨论(0)
  • 2021-01-30 19:45

    -name only matches the filename, not the whole path. You want to use -path instead, for the parts in which you are pruning the directories like def/incoming.

    0 讨论(0)
  • 2021-01-30 19:51

    This works:

    find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"
    

    Explanation:

    • find /home/feeds/data: start finding recursively from specified path
    • -type f: find files only
    • -not -path "*def/incoming*": don't include anything with def/incoming as part of its path
    • -not -path "*456/incoming*": don't include anything with 456/incoming as part of its path
    0 讨论(0)
  • 2021-01-30 19:51

    Just for the sake of documentation: You might have to dig deeper as there are many search'n'skip constellations (like I had to). It might turn out that prune is your friend while -not -path won't do what you expect.

    So this is a valuable example of 15 find examples that exclude directories:

    http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

    To link to the initial question, excluding finally worked for me like this:

    find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 
    

    Then, if you wish to find one file and still exclude pathes, just add | grep myFile.txt.

    It may depend also on your find version. I see:

    $ find -version
    GNU find version 4.2.27
    Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX
    
    0 讨论(0)
  • 2021-01-30 20:01
    find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"
    
    0 讨论(0)
提交回复
热议问题