Mv command in for loop - not working

HI Folks -

I'm very frustrated - I'm trying to execute a verys imple for loop and rename the files if they exist.

here is my loop :

ydate=`TZ=aaa24 date +%m%d`   
CR_YR=$(date "+%Y")
echo $ydate
echo ${CR_YR}

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/item/itmsales

for A in AWID601 GSCD601
do
    if ls $A${CR_YR}* 1> /dev/null 2>&1
    then
        echo "$A is available for processing"
        mv ${A}${CR_YR}*.TXT ${A}${ydate}.TXT
    else
        echo "$A does not exist - data import process aborted"
        exit 1
    fi  
done

But it says the files exist, however getting an error when trying to "mv" them.

10/10/17
StartTime:
04:15:40 AM
1009
2017
AWID601 is available for processing
Usage: mv [-I] [ -d| -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
   or: mv [-I] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
GSCD601 is available for processing
Usage: mv [-I] [ -d| -e] [-i | -f] [-E{force|ignore|warn}] [--] src target
   or: mv [-I] [-i | -f] [-E{force|ignore|warn}] [--] src1 ... srcN directory
$

I can execute the mv command manually on each file with success. Do you see anything off here?

File names I'm trying to rename:
GSCD6012017TEST.TXT
AWID6012017TEST.TXT

It's strange that you're trying to move what could be multiple files into a single one.

e.g.

$ touch 1 2 3 4
$ mv 1 2 3 4
usage: mv [-f | -i | -n] [-v] source target
       mv [-f | -i | -n] [-v] source ... directory

Change

mv ${A}${CR_YR}*.TXT ${A}${ydate}.TXT

To:

echo "mv ${A}${CR_YR}*.TXT ${A}${ydate}.TXT"

What does that say?

You should probably change the for-loop spec to use the actual filenames (or better a while-loop for handling files in this way)

I'll second what Scott suggested. Put an echo before the mv to see what is going on.

My suspicion is that one of these:

contain extra blanks or other empty space which messes up your filenames. But you won't see them because:

would not show them. If you want to test-display what is in a variable do it always like this:

echo "ydate is: \"$ydate\""

because this would make surrounding white space, hidden NLs or similar non-printable stuff stand out.

I hope this helps.

bakunin

I had this behaviour in HPUX. We had the understanding that if multiple source files were specified, then the last one mentioned would be overwritten with the penultimate one, however HPUX insisted that multiple files had to be copied to a directory.

So:-
AIX/RHEL etc.

cp a b c d e f             # Create/Overwrite f with e or copy all into directory f

HPUX

cp a b c d e f             # Errors unless f is a directory

I can see arguments for both designs, but I think HPUX is probably correct because it is strict. Not that I enjoyed having to recode chunks of scripts as we migrated ........ :rolleyes:

I hope that this helps,
Robin

Robin

Hi All!

Thank you so much for the feedback!

So, here is my output:

10/10/17
StartTime:
06:19:17 AM
1009
2017
AWID601 is available for processing
mv AWID6012017*.TXT AWID6011009.TXT
GSCD601 is available for processing
mv GSCD6012017*.TXT GSCD6011009.TXT
$

Does that look weird? I can't see anything out of the ordinary...

---------- Post updated at 06:27 AM ---------- Previous update was at 06:21 AM ----------

Also, I'm not trying to move multiple files into 1.

GSCD6012017TEST.TXT transforming in GSCD6011009.TXT
AWID6012017TEST.TXT transforming into AWID6011009.TXT

Well, suggesting to echo the mv wasn't my brightest - it was obvious what the result would be!

I can only suggest that the AWID6012017*.TXT returns multiple files, and you need to iterate through them otherwise you're trying to move multiple files into a single one, and mv takes a source and a target, and as the target is not a directory is this case, it's complaining.

Something like:

for A in AWID601 GSCD601; do
  for F in $A$CR_YR*.TXT; do
    echo mv $F ${F/$A$CR_YR/$A$ydate}
  done
done

A test:

ydate=`TZ=aaa24 date +%m%d`
CR_YR=$(date "+%Y")

# create some test files
for c in {1..5}; do
  for A in AWID601 GSCD601; do
    touch $A$CR_YR$RANDOM.TXT
  done
done

for A in AWID601 GSCD601; do
  for F in $A$CR_YR*.TXT; do
    echo mv $F ${F/$A$CR_YR/$A$ydate}
  done
done

mv AWID601201715991.TXT AWID601100915991.TXT
mv AWID601201721628.TXT AWID601100921628.TXT
mv AWID601201727511.TXT AWID601100927511.TXT
mv AWID601201730768.TXT AWID601100930768.TXT
mv AWID6012017823.TXT AWID6011009823.TXT
mv GSCD601201720182.TXT GSCD601100920182.TXT
mv GSCD601201724525.TXT GSCD601100924525.TXT
mv GSCD601201724813.TXT GSCD601100924813.TXT
mv GSCD60120175060.TXT GSCD60110095060.TXT
mv GSCD60120177596.TXT GSCD60110097596.TXT

Wow Scott - thank you.

Yes, that was exactly it. The directory is massive and I didn't realize there were other similarly named files out there. What I have done is create an archive process to be executed once the processing is complete.

Then when the ftp process lands the new files, there wont be any conflicts.

My code is as follows:

Archive() {

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/dailyinv/dailyinv

_ARCHIVEPATH=Archives/AWI_GSC_Archives/${CR_YR}_${ydate}/
mkdir -p "${_ARCHIVEPATH}"

for A in GSCXMITINV AWIXMITINV
do
    if ls ${A}* 1> /dev/null 2>&1
    then
        echo "$A is available for processing"
        mv ${A}* "${_ARCHIVEPATH}"
    else
        echo "$A does not exist - file will not be archived"
    fi  
done

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/item/itmsales

_ARCHIVEPATH=Archives/AWI_GSC_Archives/${CR_YR}_${ydate}/
mkdir -p "${_ARCHIVEPATH}"

for A in AWID601 GSCD601
do
    if ls ${A}* 1> /dev/null 2>&1
    then
        echo "$A is available for processing"
        mv ${A}* "${_ARCHIVEPATH}"
    else
        echo "$A does not exist - file will not be archived"
    fi  
done

}

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/dailyinv/dailyinv

for A in GSCXMITINV AWIXMITINV
do
    if ls ${A}${CR_YR}* 1> /dev/null 2>&1
    then
        echo "$A is available for processing"
        mv ${A}${CR_YR}*.TXT ${A}${ydate}.TXT
    else
        echo "$A does not exist - data import process aborted"
        exit 1
    fi  
done

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/app/item/itmsales

for A in AWID601 GSCD601
do
    if ls ${A}${CR_YR}* 1> /dev/null 2>&1
    then
        echo "$A is available for processing"
        mv ${A}${CR_YR}*.TXT ${A}${ydate}.TXT
    else
        echo "$A does not exist - data import process aborted"
        exit 1
    fi  
done

cd /hypbin/Oracle/Middleware/user_projects/epmsystem1/EssbaseServer/essbaseserver1/scripts/tivoli/dailysales

perl 2passdatechange.pl
sleep 60
startMaxl.sh oraclez.mxl ${CR_YR}

#::-- Archive data files after execution --::#
Archive 

Thank you all for your help!