あるフォルダから別のフォルダにファイルを移動したい。
ファイル形式に(file _name.dat
)の間にスペースがある場合とこのコマンドを使用すると、mv file _name.dat /tmp
ファイルは移動しません。
ただし、 を使用するとmv "file _name.dat" /tmp
ファイルが移動します。
file _name.dat
自動的に移動したときに変更するのに役立つスクリプトを書くのに役立ちます。"file _name.dat"
答え1
あなたの質問は理解するのが難しいです。特に、あなたが必要とするコードをコピーして貼り付けます。そしてエラーメッセージをコピーして貼り付ける。
つまり、古典的なミスを犯している可能性が高いのです。
シェルスクリプトに変数置換($file
または$1
)などが含まれている場合、拡張結果はスペースで区切られた一連のワイルドカードパターンとして扱われます。変数は単一の単語として扱われず、パターンのリストとして扱われます。だから、書くなら
mv $1 /tmp # <<<< BAD
次に実行すると、コマンドはmyscript "file _name.dat"
3つのパラメータをmv
受け取りますfile
。実行すると、現在のディレクトリ内のすべてのファイルが移動されます。_name.dat
/tmp
myscript "*.dat"
.dat
これを防ぐには、二重引用符の間に変数置換を入力してくださいmv "$1" /tmp
。これにより、mv
常に2つの引数、つまりスクリプトの最初の引数と/tmp
。変数の値をワイルドカードパターンのリストとして扱う必要がある場合は非常にまれです。したがって、次の簡単な規則を覚えておいてください。
変数の置換には常に二重引用符を使用してください。:
"$foo"
、"$1"
待つ。これはコマンドの置き換えでも機能します。"$(mycommand)"
また、ファイル名が-
ダッシュ()で始まる場合は、mv
オプションと見なされます。これを防ぐには、--
最後にオプションを渡します。それ以降のすべての項目は、--
オプションではなく引数(の場合はファイルまたはディレクトリ名mv
)です。ほとんどのコマンドは--
フラグで終わるオプションを認識します。
mv -- "$1" /tmp
myscript file _name.dat /tmp
シェルにスクリプトを作成して呼び出す場合は不可能です。スクリプトは引数を個別に受け取るため、コマンドラインにスペースをいくつ入力するかはわかりません。 (これはプログラムが独自の引数を解析するWindowsとは異なります。Unixではプログラムは引数のリストを受け取ります。)他のシェルスクリプトからスクリプトを呼び出す場合は、呼び出しスクリプトでも正しい引用符を使用してください。