Olli
Olli

Reputation: 532

Show where directory exists

I have a bunch of code thats relatively new i.e. lots of bugs hiding and I have code as such:
if [ -d $DATA_ROOT/$name ], I've done research and understand that this means if directory exists but now I'm trying to print out those directories that exist to fix a problem. Tried using

    echo `First: $DATA_ROOT`
    echo `Second: $name`
    echo `Last: $DATA_ROOT/$name`
    exit 1;

Got command not found for all, the code is meant to fix the bug I'm trying to by extracting all files but does not end up extracting all ending up with the data extraction failed error below, code:

num_files=`find $DATA_ROOT/$name -name '*' | wc -l`
if [ ! $num_files -eq $extract_file ] ; then
    echo "Data extraction failed! Extracted $num_files instead of $extract_file"
    exit 1;

I just want to extract all files correctly, how to do this please?

Upvotes: 0

Views: 80

Answers (3)

SMA
SMA

Reputation: 37023

You are using backticks and hence anything under backticks is treated as a command to execute and as a result you are getting command not found exception. You could use double quotes to avoid the error like below:

echo "First: $DATA_ROOT"
echo "Second: $name"
echo "Last: $DATA_ROOT/$name"

You could use find command to list down all directories like:

find $DATA_ROOT/$name -type d

Above command would list all the directories (with -type d option and use -type f to list all the files) within $DATA_ROOT/$name and then you can perform operations on those directories.

Upvotes: 0

Soren
Soren

Reputation: 14688

The back-ping you are using means "execute this as an command"

echo `First: $DATA_ROOT`
echo `Second: $name`
echo `Last: $DATA_ROOT/$name`

would try to execute a command called "First:" which does not exists.

Instead use double quotes as they allow for variable substitution, like this and does not try to execute it as a command

echo "First: $DATA_ROOT"
echo "Second: $name"
echo "Last: $DATA_ROOT/$name"

Also

find $DATA_ROOT/$name -name '*'

is probably not what you want, the -name '*' is the default so you don't need it. As others points out, find will return everything, including directories and special files if you have any of those. find "$DATA_ROOT/$name" -type f is what you want if you only want to list the files or find "$DATA_ROOT/$name" -type d if you only want to list directories. Also always use double quotes around your "$DATA_ROOT/$name" as it allows you to handle file names with spaces -- if you have a $name that contains a space you will fail otherwise.

Upvotes: 2

Kirill Bulygin
Kirill Bulygin

Reputation: 3826

find reports not only ordinary files, but also directories (including .).

Use find "$DATA_ROOT/$name" -type f.

Upvotes: 0

Related Questions