如果不做某事,使用IF来查看目录是否存在

时间:2015-03-04 20:33:49

标签: linux bash shell unix

如果$ DIR2没有相同的目录名,我试图将目录从$ DIR1移动到$ DIR2

if [[ ! $(ls -d /$DIR2/* | grep test) ]]是我现在拥有的。 then mv $DIR1/test* /$DIR2 fi

首先给出

ls: cannot access //data/lims/PROCESSING/*: No such file or directory
当$ DIR2为空时

然而,它仍然有效。

其次 当我运行shell脚本两次。 它不允许我移动名称相似的目录。

例如,

在$ DIR1中,我有test-1 test-2 test-3 当它第一次运行时,所有三个目录都移动到$ DIR2 之后我在$ DIR1做了mkdir test-4并再次运行脚本.. 它不会让我移动test-4,因为我的循环认为test-4已经存在,因为我抓住了所有的测试

如何绕过并移动测试-4?

2 个答案:

答案 0 :(得分:1)

首先,您可以使用bash内置的“True if directory exists”表达式来检查目录是否存在:

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

但是,您想测试某些内容是否不是目录。您已在代码中显示您已经知道如何否定表达式:

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

您似乎也在使用ls来获取文件列表。如果文件不是目录,也许你想循环它们并做一些事情?

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

寻找像这样的bash东西的好地方是Machtelt Garrels的指南。 His page on the various expressions you can use in if statements给了我很多帮助。

如果目录中尚不存在目录,则将目录从源移动到目标:

为了便于阅读,我将DIR1DIR2称为srcdest。首先,让我们声明它们:

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

请注意尾部斜杠。我们将文件夹的名称附加到这些路径,以便尾部斜杠使这更简单。您似乎也在限制要移动的目录,无论他们的名字中是否有test这个词:

filter="test"

所以,让我们首先遍历source中传递filter的目录;如果dest中不存在它们,那就让它们移动到那里:

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

我希望能解决你的问题。但是要注意,@gniourf_gniourf在评论中发布了一个应该注意的链接!

答案 1 :(得分:0)

如果您需要根据某种模式将某些目录复制到另一个目录,那么您可以使用find:

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

详细说明:

     

-type d - 将仅搜索目录

     

-name"" - 设置搜索模式

     

-exec - 使用查找结果执行某些操作

     

-t, - target-directory = DIRECTORY将所有SOURCE参数移到DIRECTORY

有许多exec或xargs用法的例子。

如果您不想覆盖文件,请将-n选项添加到mv命令:

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

-n, - no-clobber不会覆盖现有文件