0

当 dirs 存在时,我的条件可以正常工作,但如果它们不存在,它似乎会同时执行thenandelse语句(这是正确的术语吗?)。

脚本.sh

#!/bin/bash
if [[ $(find path/to/dir/*[^thisdir] -type d -maxdepth 0) ]]
  then
    find path/to/dir/*[^thisdir] -type d -maxdepth 0 -exec mv {} new/location \;
    echo "Huzzah!"
  else
    echo "hey hey hey"
fi

提示
第一次调用,目录就在那里;在第二个中,他们已从第一个电话中移出。

$ sh script.sh
Huzzah!
$ sh script.sh
find: path/to/dir/*[^thisdir]: No such file or directory
hey hey hey

我怎样才能解决这个问题?

尝试过的建议

if [[ -d $(path/to/dir/*[^thisdir]) ]]
  then
    find path/to/dir/*[^thisdir] -type d -maxdepth 0 -exec mv {} statamic-1.3-personal/admin/themes \;
    echo "Huzzah!"
  else
    echo "hey hey hey"
fi

结果

$ sh script.sh
script.sh: line 1: path/to/dir/one_of_the_dirs_to_be_moved: is a directory
hey hey hey
4

4 回答 4

2

似乎有一些错误:

首先,模式path/to/dir/*[^thisdir]在 bash 中的解释方式与path/to/dir/*[^dihstr]表示 *all filename 以d, i, h,s或结尾的t 方式 r相同。

如果您在目录 ( path/to/dir) 中搜索某些内容,但不在 on 上path/to/dir/thisdir而不是在第 n 个 subdir 上,则可以禁止find并编写:

编辑:我的样本也有错误:[ -e $var ]错了。

declare -a files=( path/to/dir/!(thisdir) )
if [ -e $files ] ;then
    mv -t newlocation "${files[@]}"
    echo "Huzzah!"
else
    echo "hey hey hey"
fi

如果您需要find在 subirs 中搜索,请给我们样品和/或更多描述。

于 2012-11-11T10:13:17.040 回答
1

您的错误可能发生在if [[ $(find path/to/dir/*[^thisdir] -type d -maxdepth 0) ]]然后它会因为找到错误而转到其他地方。

find希望其目录参数存在。根据您要执行的操作,您可能应该考虑

$(find path/to/dir/ -name "appropriate name pattern" -type d -maxdepth 1)

另外,我会考虑在if. 有关文件条件,请参阅this

于 2012-11-11T01:03:45.927 回答
0

OP 希望将除thisdir之外的所有文件移动到新位置。

using 的解决方案find是排除thisdirusingfind的功能,而不是通过 usingbash的 shell 扩展:

#!/bin/bash
if [[ $(find path/to/directory/* -maxdepth 0 -type d -not -name 'thisdir') ]]
    then
        find path/to/directory/* -maxdepth 0 -type d -not -name 'thisdir' -exec mv {} new/location \;
        echo "Huzzah!"
    else
        echo "hey hey hey"
fi

这已经过测试,可以在bash4.2.39 版和 GNU findutils v4.5.10 下运行。

于 2012-11-11T10:24:37.980 回答
0

按照本文的建议,尝试#!/bin/bash在第一行添加 a 以确保执行脚本的是 bash:

为什么 if 和 else 都被执行?

于 2012-11-11T01:09:42.080 回答