[SOLVED]

Bing ChatGPT is THE sh*t man! It got this right in a few secs!!! WOW! Thank you to everyone who answered me, it’s due to your help that I was able to solve it through Bing. But holy F, am I impressed with Bing!

I hate MS and I hated bing,BUT they have got something real good here.

find /home/$USER -maxdepth 1 -type f -executable -exec sh -c 'head -n 1 "$1" | grep -q "^#!/bin/bash" && cp "$1" /home/bob/Documents/Linux/Regularly_Copied_files_crontab' sh {} \;


edit: I just want to copy scripts in /home/$USER folder, not all the other subfolders.

edit 2: I think the better approach here would be to have two conditions.

  1. The file is in /home/$USER/ and not in it’s subfolders.
  2. The file’s first line should be #!/bin/bash

I don’t actually need all executable files, I just want my bash scripts, but unfortunately, I don’t have the good habit of giving the .sh extensions to all of them. These files are all executable, they all have a shebang line (`#!/bin/bash) as their first line, how can I copy them elsewhere? I mean, I know how the copy commands work, but I don’t know if I can specify the pattern here.

How would I specify a cp command to only copy bash scripts to my docs folder?

Intended Use case: I am trying to create a command to copy all the bash scripts I have created in my home folder to my Documents folder. My docs folder is synced everyday, so I won’t ever lose my scripts as they would be stored in the cloud.

find ~ -type f -executable

find /home/user -type f -perm /u+x -not -path “/home/user/Documents” -exec cp {} ~/Documents ;

___

  • @[email protected]
    link
    fedilink
    English
    69 months ago

    find /home/user -type f -perm /u+x -not -path "/home/user/Documents" -exec cp {} ~/Documents \;

    Run it without exec -parameter to get a list of files affected, I’d guess that that will catch more than you want as it only checks that it’s a normal file and has the excecutable -bit on. To get only bash-scripts you’d first need to get a list of files with find and then check if it’s a script with something (grep or maybe file should work) and copy based on that result, but it shouldn’t be too difficult to write a script for it.

  • @[email protected]
    link
    fedilink
    49 months ago

    find ~ -type f -executable

    will give you a list of all executable files You can probably use find’s -exec to move them all.

    • @Synthead
      link
      29 months ago

      This is the right answer. OP got quite the command from Bing 😉

  • Astigma
    link
    fedilink
    English
    49 months ago

    grep -rl '#!/bin/bash' . | xargs -I {} cp {} /path/to/destination/

    • Ganesh VenugopalOP
      link
      fedilink
      19 months ago

      One problem, I think it’s copying all the files inside folder /home/$USER whereas I just want the bash files which are in /home/$USER exlcluding all the subfolders. The command grep -rl '#!/bin/bash' . | xargs -I {} cp {} /path/to/destination/ won’t exclude subfolders.

        • Ganesh VenugopalOP
          link
          fedilink
          19 months ago

          grep -l ‘#!/bin/bash’ . | xargs -I {} cp {} /path/to/destination/

           grep -l '#!/bin/bash' . | xargs -I {} cp {} /home/$USER/Documents/Linux/Regularly_Copied_files_crontab
          grep: .: Is a directory
          

          I don’t know what’s happening here

  • @[email protected]
    link
    fedilink
    English
    2
    edit-2
    9 months ago

    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.

  • @lem
    link
    English
    1
    edit-2
    9 months ago

    identify

    find DIR -executable

    copy

    find DIR -executable -exec cp {} TARGETDIR \;