ディレクトリを別のディレクトリに移動する場合、ターゲット ディレクトリが存在しないときにエラーを生成する簡単な方法はありますか?

ディレクトリを別のディレクトリに移動する場合、ターゲット ディレクトリが存在しないときにエラーを生成する簡単な方法はありますか?

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

を使用しておりbashmvコマンドが非 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

関連情報