为什么这个条件返回“没有这样的文件或目录”

时间:2012-11-11 00:48:19

标签: bash conditional

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

script.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

提示
第一次电话,dirs在那里;在第二次,他们已经从第一次电话中移开。

$ 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 个答案:

答案 0 :(得分:2)

似乎有一些错误:

首先,模式path/to/dir/*[^thisdir]在bash中的解释方式与path/to/dir/*[^dihstr]意味着*所有以dih结尾的文件名相同, st r

如果您要搜索目录(path/to/dir)中的某些内容,而不是path/to/dir/thisdir而不是第n个子目录,你可以禁止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进行搜索,请提供样本和/或更多说明。

答案 1 :(得分: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

答案 2 :(得分:0)

尝试在第一行添加#!/bin/bash以确保它是正在执行您的脚本的bash,如本帖所述:

Why is both the if and else executed?

答案 3 :(得分:0)

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

使用find的解决方案是使用thisdir的功能排除find,而不是使用bash的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

这已经过测试,可在bash版本4.2.39和GNU findutils v4.5.10下运行。