为什么这种条件回报"No such file or directory"



当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

提示
对于第一个调用,目录在那里;在第二个调用中,它们已从第一个调用移动。

$ 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

似乎有一些错误:

首先,模式path/to/dir/*[^thisdir]在 bash 中的解释方式与 *all 文件名以dihstr结尾path/to/dir/*[^dihstr]相同的方式解释。

如果你在这个目录(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在subirs中进行搜索,请向我们提供样品和/或更多描述。

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

find希望其目录参数存在。根据您要做的事情,您可能应该考虑

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

另外,我会考虑在if中使用实际的逻辑函数。有关文件条件,请参阅此处。

尝试在第一行添加一个#!/bin/bash,以确保执行脚本的是 bash,如这篇文章所建议的那样:

为什么 if 和 else 都被执行?

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

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

相关内容

  • 没有找到相关文章