Bash to copy subfolder and files to matching directory

The bash executes but returns no results and the set -xv showed while the $run variable in blue, was extracted correctly, the $match value in green, was not, rather both values in home/cmccabe/Desktop/f1 were extracted not just the matching.

There will always be an exact match from the $run to the $match but there may be more than one. In all cases I am trying to cp the $run to the corresponding $match . When a match is found the contents of the $run subfolder and .zip and copied to $match . I havent added this as I am not sure how. Thank you :).

run directory ---- this is $run ----

R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions   --- top level ---
   f1  --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- zip file in f1 ---
   f2   --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- zip file in f2 ---
   f3   --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- --- zip file in f3 ---

match directory ---- this is $match ----

R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions
R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions
# grab run directory
set -xv
for dir in /home/cmccabe/medex.logs/ponc/*/; do
  if [ -d $dir ]; then
     run=$(basename $dir)
  fi
# find match and copy run
cd /home/cmccabe/Desktop/f1
match=$(find * -maxdepth 1 -type d)
   if [ $run = $match ]
    then
   #cp -v $run /home/cmccabe/Desktop/f1/$match
  fi
done

bash [too many arguments

set -xv

+ '[' R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions = R_2019_01_23_13_22_58_user_S5-0271-93-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ']'

Your code typo corrected. It is POSIX shell compliant, and it works with Bash too.

#!/bin/sh

# POSIX shell compliant.

# grab run directory.
set -xv

for dir in /home/cmccabe/medex.logs/ponc/*/ ; do


  if [ -d "$dir" ] ; then
     run="$(basename "$dir")"
  fi


  # find match and copy run.
  # the program exits 1, in case the directory can not be accessed, or does not exist.
  cd /home/cmccabe/Desktop/f1 || exit 1


  # https://github.com/koalaman/shellcheck/wiki/SC2035
  match="$(find ./* -maxdepth 1 -type d)"


  if [ "$run" = "$match" ]
  then
    # cp -v "$run" /home/cmccabe/Desktop/f1/"$match"
  fi


done
1 Like

I think I finished your program. Test it, and tell us if it works.

#!/bin/sh

# POSIX shell compliant.

# grab run directory.
set -xv

for dir in /home/cmccabe/medex.logs/ponc/*/ ; do


  if [ -d "$dir" ] ; then
     run="$(basename "$dir")"
  fi


  # the program exits 1, in case the directory can not be accessed, or does not exist.

  cd /home/cmccabe/Desktop/f1 || exit 1


  # https://github.com/koalaman/shellcheck/wiki/SC2035
  
  findOutput="$(find ./* -maxdepth 1 -type d)"


  # find match and copy run.

  for match in $findOutput
  do
  
    if [ "$run" = "$match" ]
    then

      cp -Rv "$run" /home/cmccabe/Desktop/f1/"$match"
  
    fi
  
  done


done

exit 0
1 Like

The script executes and moves the copies the matching directory (parent) only. The sub-folders within it are not copied over.
So the filename in green below is copied but not the subdirectories within it. Thank you :).

R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions   --- top level ---
   f1  --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- zip file in f1 ---
   f2   --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- zip file in f2 ---
   f3   --- subfolder under R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions ---
    zip --- --- zip file in f3 ---

match directory ---- this is $match ----

R_2019_01_23_13_22_58_user_S5-0271-93-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions
R_2019_01_23_13_22_58_user_S5-0271-96-v5.6_Oncomine_Childhood_Cancer_Research_DNA_and_Fusions

See the following proposal, with some comments:

#!/bin/sh

# grab run directory.

# POSIX shell compliant.

# external commands to be found in
PATH=/bin:/usr/bin

# debug:
#set -xv

# dryrun:
dryrun="echo"

# exit in case the directory can not be accessed
cd /home/cmccabe/Desktop/f1 || exit 1

for dir in /home/cmccabe/medex.logs/ponc/*/
do

  # the */ filters for directories, the following checks for a null match
  [ -d "$dir" ] || continue

  run=$(basename "$dir")

  # find match and copy run.

  # https://github.com/koalaman/shellcheck/wiki/SC2035
  # A * glob can overflow "too many arguments"
  # get two levels * and */*
  #match=$(find . -mindepth 1 -maxdepth 2 -type d)
  #if [ "$run" = "$match" ]
  # can this ever be true? $match is newline-separated!
  
  # test one level; the 2nd level would be */"$run", it could loop thru both with
  #for match in "$run" */"$run"
  match=$run
  if [ -d "$match" ]
  then
    # the following will copy to $match/$run/
    #$dryrun cp -Rv "$dir" "$match"
    # the following will copy to $match/
    $dryrun cp -Rv "$dir" "$(dirname "$match")"
  fi

done
1 Like

There are logical errors in the code.

For example

for dir in /home/cmccabe/medex.logs/ponc/*/ ; do

  if [ -d "$dir" ] ; then
     run="$(basename "$dir")"
  fi

$run is always *

Please tell where the source directories to be copied are located (the full directory path), and what is the target directory (the full directory path).

1 Like

No it's not - dir cycles thru the matches!

1 Like

You are right, my mistake.