mv directory1 directory2/
私は、名前を間違って入力すると失敗し、ディレクトリが存在しないという警告が表示されるだろうと考えていましたdirectory2
。しかし、実際にはそうではありませんでした。
これを実現する簡単な方法はありますか? (ターゲット ディレクトリが存在しない場合は失敗します)。
答え1
mv -t directory2/ directory1
からman 1 mv
:
mv [OPTION]... -t DIRECTORY SOURCE...
-t
、--target-directory=DIRECTORY
すべてのSOURCE
引数をDIRECTORY
ただし、このオプションは POSIX では必須ではありません。mv
サポートされる場合とされない場合があります。
例:
$ ls
$ # Nothing here so far
$ mkdir foo bar
$ # Let's move foo to bar/
$ mv -t baz/ foo # Oops, a typo, with -t
mv: failed to access 'baz/': No such file or directory
$ mv foo baz/ # Oops, a typo, without -t
$ ls
bar baz
$
答え2
を使用しておりbash
、mv
コマンドが非 POSIX オプションをサポートしていない場合でも、次のようにファイル内で-t
関数を定義できます。mvdir
.bashrc
mvdir() {
if [ -d "$2" ]
then
mv "$1" "$2"
else
printf 'mvdir: "%s" does not exist, or is not a directory\n' "$2" >&2
return 1
fi
}
この関数定義が整えば、次のように言うことができます。
mvdir directory1 directory2
よりコンパクトな形式では、この関数の中心となるコマンドは次のようになります。
( [ -d directory2 ] && mv directory1 directory2 )
このロジックは関数内で若干拡張され、directory2 が存在しないかディレクトリではない場合にエラー メッセージをよりわかりやすく表示します。宛先ディレクトリが存在する場合は、mv
が実行され、エラー メッセージまたは結果コードが によって生成されますmv
。ディレクトリが存在しない場合は、printf
が に診断を書き込みstderr
、関数はエラーを示すゼロ以外の結果コードを返します。
テストするには、空のディレクトリから開始します。
$ find *
find: *: No such file or directory
$ mkdir A
$ find *
A
$ mvdir A B || echo fail
mvdir: "B" does not exist, or is not a directory
fail
$ mkdir B
$ find *
A
B
$ mvdir A B || echo fail
$ find *
B
B/A