【问题标题】:using IF to see a directory exists if not do something如果不做某事,则使用 IF 查看目录是否存在
【发布时间】:2015-05-06 00:36:23
【问题描述】:

如果 $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 已经存在,因为我正在抓取所有测试

我怎样才能四处走动并移动 test-4 ?

【问题讨论】:

  • 这是两个独立的问题吗?如果是这样,您可以将它们作为单独的问题发布吗?

标签: linux bash shell unix


【解决方案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

Machtelt Garrels 的指南是寻找此类 bash 内容的好地方。 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 在 cmets 中发布了应注意的链接!

【讨论】:

  • 我编辑问题。希望这有助于您的理解
  • @gniourf_gniourf 谢谢,这是一个很棒的链接 - 很高兴学习新东西:-)
  • 还是找不到解决办法。我随意使用了你的编码,但这个编码没有做任何事情。
  • @Young 尝试将mv 命令更改为echo,看看它在做什么。
  • 我在评论之前也这样做了......但它没有回应任何东西......我目前正在玩你的代码,看看我是否能找到一些东西
【解决方案2】:

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

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

详情:

-type d - 只搜索目录

-name "" - 设置搜索模式

-exec - 对查找结果做一些事情

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

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

如果您不想覆盖文件,则在 mv 命令中添加 -n 选项:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多