![“仅移动文件夹(如果存在)”不起作用](https://linux22.com/image/205334/%E2%80%9C%E4%BB%85%E7%A7%BB%E5%8A%A8%E6%96%87%E4%BB%B6%E5%A4%B9%EF%BC%88%E5%A6%82%E6%9E%9C%E5%AD%98%E5%9C%A8%EF%BC%89%E2%80%9D%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我试图将文件夹移动到其他目录(仅当它们存在时)。我试过这个
project_dir="/home/user/Desktop/Code/projectX"
public_folders=(css sass js vendor)
for item in "${public_folders[@]}";
do
[ ! -f "$item" ] || mv -v "$item" "$project_dir"/public/"$item"
done
但当我运行脚本时,文件夹没有移动。有什么问题吗?
答案1
您的测试与您想要的相反。
[ ! -f $item ] || mv -v $item $project_dir/public/$item
!
与 的组合使其||
实际上与 相同[ -f $item ] && ...
。
即您正在测试是否$item
是常规文件,mv
如果是,则对其进行 -ing。目录永远不会对该测试返回 true,因为它不是常规文件,而是目录。您应该测试它是否是一个目录,而-d
不是-f
.
相反,这样做(记住也用双引号引用你的变量):
[ -d "$item" ] && mv -v "$item" "$project_dir/public/"
顺便说一句,即使使用也是[ ! -f "$item" ] && mv ...
不正确的,因为目录并不是唯一不存在的“文件”常规文件- 在 Linux 上,还有块设备节点、字符设备节点、套接字、命名管道和符号链接。看Unix 文件类型