我的条件在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
提示
第一次电话,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
答案 0 :(得分:2)
似乎有一些错误:
首先,模式path/to/dir/*[^thisdir]
在bash中的解释方式与path/to/dir/*[^dihstr]
意味着*所有以d
,i
,h
结尾的文件名相同, s
,t
或 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,如本帖所述:
答案 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下运行。