Shell script to copy and prepend folder name to files from multiple subdirectories Shell script to copy and prepend folder name to files from multiple subdirectories shell shell

Shell script to copy and prepend folder name to files from multiple subdirectories


I would use something like this:

find -type f -exec sh -c 'f={}; fnew=$(rev <<< "$f" | sed 's~/~_~' | rev); echo "mv $f $fnew"' \;

This looks for files within the current directory structure and perform the following:

  • get the file name
  • replace the last / with _.
  • write echo "cp $old_file $new_file"

Once you have run this and seen it prints the proper command, remove the echo so that it effectively does the mv command.

I know the fnew=$(rev <<< "$f" | sed 's~/~_~' | rev) is a bit ugly trick, but I couldn't find a better way to replace the last / with _. Maybe sed -r 's~/([^/]*)$~_\1~' could also be appropiate, but I always like using rev :)


Since your find does not behave well with the -sh c expression, let's use a while loop for it:

while read -r filedo    new_file=$(rev <<< "$file" | sed 's~/~_~' | rev)    echo "mv $file $new_file"; done < <(find . -type f)done < <(find . -type f)

As a one-liner:

while read -r file; do new_file=$(rev <<< "$file" | sed 's~/~_~' | rev); echo "mv $file $new_file"; done < <(find . -type f)


functions to the rescue, updating Jahid's script:

function updateFolder{    mkdir "$2"    for folder in "$1"/*; do    if [[ -d $folder ]]; then        foldername="${folder##*/}"        for file in "$1"/"$foldername"/*; do            filename="${file##*/}"            newfilename="$foldername"_"$filename"            cp "$file" "$2"/"$newfilename"        done    fi    done}

used:

$ updateFolder /parent /newfolder


This is a bit tedious but will do:

#!/bin/bashparent=/parentnewfolder=/newfoldermkdir "$newfolder"for folder in "$parent"/*; do  if [[ -d "$folder" ]]; then    foldername="${folder##*/}"    for file in "$parent"/"$foldername"/*; do      filename="${file##*/}"      newfilename="$foldername"_"$filename"      cp "$file" "$newfolder"/"$newfilename"    done  fidone

Put the parent path to parent variable and newfolder path to newfolder variable.