Young
Young

Reputation: 53

using IF to see a directory exists if not do something

I am trying to move the directories from $DIR1 to $DIR2 if $DIR2 does not have the same directory name

if [[ ! $(ls -d /$DIR2/* | grep test) ]] is what I currently have. then mv $DIR1/test* /$DIR2 fi

first it gives

ls: cannot access //data/lims/PROCESSING/*: No such file or directory

when $DIR2 is empty

however, it still works.

secondly when i run the shell script twice. it doesn't let me move the directories with the similar name.

for example in $DIR1 i have test-1 test-2 test-3 when it runs for the first time all three directories moves to $DIR2 after that i do mkdir test-4 at $DIR1 and run the script again.. it does not let me move the test-4 because my loop thinks that test-4 is already there since I am grabbing all test

how can I go around and move test-4 ?

Upvotes: 2

Views: 1791

Answers (2)

idobr
idobr

Reputation: 1647

If you need to mv some directories to another according to some pattern, than you can use find:

find . -type d -name "test*" -exec mv -t /tmp/target {} +

Details:

-type d - will search only for directories

-name "" - set search pattern

-exec - do something with find results

-t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY

There are many examples of exec or xargs usage.

And if you do not want to overwrite files, than add -n option to mv command:

find . -type d -name "test*" -exec mv -n -t /tmp/target {} +

-n, --no-clobber do not overwrite an existing file

Upvotes: 0

QuiteClose
QuiteClose

Reputation: 686

Firstly, you can check whether or not a directory exists using bash's built in 'True if directory exists' expression:

test="/some/path/maybe"
if [ -d "$test" ]; then
    echo "$test is a directory"
fi

However, you want to test if something is not a directory. You've shown in your code that you already know how to negate the expression:

test="/some/path/maybe"
if [ ! -d "$test" ]; then
    echo "$test is NOT a directory"
fi

You also seem to be using ls to get a list of files. Perhaps you want to loop over them and do something if the files are not a directory?

dir="/some/path/maybe"
for test in $(ls $dir);
do
    if [ ! -d $test ]; then
        echo "$test is NOT a directory."
    fi
done

A good place to look for bash stuff like this is Machtelt Garrels' guide. His page on the various expressions you can use in if statements helped me a lot.

Moving directories from a source to a destination if they don't already exist in the destination:

For the sake of readability I'm going to refer to your DIR1 and DIR2 as src and dest. First, let's declare them:

src="/place/dir1/"
dest="/place/dir2/"

Note the trailing slashes. We'll append the names of folders to these paths so the trailing slashes make that simpler. You also seem to be limiting the directories you want to move by whether or not they have the word test in their name:

filter="test"

So, let's first loop through the directories in source that pass the filter; if they don't exist in dest let's move them there:

for dir in $(ls -d $src | grep $filter); do
    if [ ! -d "$dest$dir" ]; then
        mv "$src$dir" "$dest"
    fi
done

I hope that solves your issue. But be warned, @gniourf_gniourf posted a link in the comments that should be heeded!

Upvotes: 1

Related Questions