「フォルダがある場合にのみ移動」は機能しません。

「フォルダがある場合にのみ移動」は機能しません。

フォルダを別のディレクトリに移動しようとしています(存在する場合のみ)。私はこれを試しました

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 です。ディレクトリは通常のファイルではなくディレクトリなので、このテストでは絶対真を返しません。-dではないディレクトリであることをテストする必要があります-f

代わりに、次のようにします(変数を二重引用符で引用することも忘れないでください)。

[ -d "$item" ] && mv -v "$item" "$project_dir/public/"

ところで、[ ! -f "$item" ] && mv ...ディレクトリが存在しない唯一の「ファイル」ではないので、それを使用することさえ正しくありません。一般ファイル- Linuxには、ブロックデバイスノード、キャラクタデバイスノード、ソケット、名前付きパイプ、およびシンボリックリンクもあります。バラよりUnixファイルの種類

関連情報