assuming you have a GNU toolchain you can use the find
command like so:
find . -type f -executable -exec sh -c '
case $( file "$1" ) in (*Bourne-Again*) exit 0; esac
exit 1' sh {} \; -print0 | xargs -0 -I{} cp {} target/
This first finds all executable files in the current directory (change the “.” arg in find to search other dirs), uses the file
command to test if it’s a bash file, and if it is, pipes the file name to xargs
which calls cp
on each file.
note: if “target” is inside the search directory you’ll get output from cp
that it skipped copying identical files. this is because find
will find them a free you copy them so be careful!
note 2: this doesn’t preserve the directory structure of the files, so if your scripts are nested and might have duplicate names, you’ll get errors.
SMS is literally the bottom of the barrel though