当dirs存在时,我的条件可以正常工作,但如果它们不存在,它似乎同时执行then
和else
语句(这是正确的术语吗?
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 文件名以d
、i
、h
、s
、t
或r
结尾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下工作。