“仅移动文件夹(如果存在)”不起作用

“仅移动文件夹(如果存在)”不起作用

我试图将文件夹移动到其他目录(仅当它们存在时)。我试过这个

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 文件类型

相关内容