Recursively read folders and executes command on each of them

后端 未结 7 1579
执笔经年
执笔经年 2020-12-12 21:05

I am trying to recurse into folders and then run commands on them, using bash script. Any suggestions?

相关标签:
7条回答
  • 2020-12-12 21:38

    Something like this should achieve your goal:

    function RecurseDirs
    {
        oldIFS=$IFS
        IFS=$'\n'
        for f in "$@"
        do
        -----your activity here-----
            if [[ -d "${f}" ]]; then
                cd "${f}"
                RecurseDirs $(ls -1 ".")
                cd ..
            fi
        done
        IFS=$oldIFS
    }
    
    0 讨论(0)
  • 2020-12-12 21:40

    If you want to recurse into directories, executing a command on each file found in those, I would use the find command, instead of writing anything using shell-script, I think.

    That command can receive lots of parameters, like type to filter the types of files returned, or exec to execute a command on each result.


    For instance, to find directories that are under the one I'm currently in :

    find . -type d -exec echo "Hello, '{}'" \;
    

    Which will get me somehthing like :

    Hello, '.'
    Hello, './.libs'
    Hello, './include'
    Hello, './autom4te.cache'
    Hello, './build'
    Hello, './modules'
    


    Same to find the files under the current directory :

    find . -type f -exec echo "Hello, '{}'" \;
    

    which will get me something like this :

    Hello, './config.guess'
    Hello, './config.sub'
    Hello, './.libs/memcache_session.o'
    Hello, './.libs/memcache_standard_hash.o'
    Hello, './.libs/memcache_consistent_hash.o'
    Hello, './.libs/memcache.so'
    Hello, './.libs/memcache.lai'
    Hello, './.libs/memcache.o'
    Hello, './.libs/memcache_queue.o'
    Hello, './install-sh'
    Hello, './config.h.in'
    Hello, './php_memcache.h'
    ...
    


    Some would say "it's not shell"... But why re-invent the wheel ?
    (And, in a way, it is shell ^^ )


    For more informations, you can take a look at :

    • man find
    • lots of tutorials found with google, like, for instance, Unix Find Command Tutorial
    0 讨论(0)
  • 2020-12-12 21:42

    Sorry I don't understand what you are asking. The best I can guess with your question is

    find -type d -exec scriptname.sh \{\} \;
    
    0 讨论(0)
  • 2020-12-12 21:49

    Bash 4.0 introduced the globstar option, so a construct like:

    for f in mydir/**/*
    do
      # operations here
    done
    

    ...will act recursively on whatever lands in $f. Turn this on with "shopt -s globstar", otherwise the ** will be treated as a singular *.

    Found this gem today at http://www.linuxjournal.com/content/globstar-new-bash-globbing-option, after being inspired by the zsh construct (which I have enabled by default).

    0 讨论(0)
  • 2020-12-12 21:50

    Have a look at the find command and check the switches -type (use d to specify directory) and -exec (to specify a command to execute).

    0 讨论(0)
  • 2020-12-12 21:52

    Some basic shells miss commands like 'find' and some of their commands don't support recursivity. In that case you can use this script to run the desired command in all subdirs in the tree:

    CDIR=$(pwd)
    for i in $(ls -R | grep :); do
        DIR=${i%:}                    # Strip ':'
        cd $DIR
        $1                            # Your command
        cd $CDIR
    done
    

    If you name the above "recurse.sh" then use:

    ./recurse.sh <command>
    

    Example (change the owner/group to 'root' of all files in the tree):

    ./recurse.sh "chown 0:0 *"
    
    0 讨论(0)
提交回复
热议问题