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.