ターゲットが同じドライブ上にある場合のみ、mvを使用してUNIXでフォルダーを移動する方法


10

unix mvコマンドを使用してフォルダを移動する必要がありますが、ターゲットが同じドライブまたは同じファイルシステムにある場合のみです。最善のアプローチは何でしょうか?

linux  bash  shell  unix  mv 

1
ここでドライブするとは、「デバイス」ですか?例えば同じハードディスク?
ケント

同じデバイス、はい

回答:


9

2つのディレクトリまたはファイルが同じファイルシステムに属しているかどうかを確認する方法に基づく(/unix//):

Linuxのシェルスクリプトでは、statを使用して実行できます。

stat -c "%d" /path  # returns the decimal device number

だからあなたはできる:

file1=$(stat -c "%d" /path/file1)
file2=$(stat -c "%d" /path/file2)

次に比較します。

次のように書くこともできます:

if [ $(stat -c "%d" /path/file1) -eq $(stat -c "%d" /path/file1) ]
then
    # mv sentence
fi

その他のオプション。Stackexchangeの質問からも引用

if [[ $(df -P /path/file1 | tail -1) = $(df -P /path/file2 | tail -1) ]]
then
    # echo "same filesystem"
    # mv sentence
fi

Linuxディストリビューション間で互換性があると思いますか?

より良い実践を広めるために、$(...)代わりにを使用してください`...`。後者は前者を支持して非難されます。
Shahbaz 2013

@Shahbazに感謝します。あなたの推薦で編集しました!
fedorqui 2013

@zappわからない。テストする必要がある。私の経験でstatは、少なくともSunOSでは、それは時々トリッキーです。しかし、Linuxであるため、互換性があることを願っています。私のUbuntu 12では問題ありません。
fedorqui 2013

これは、%d(同じパーティションも)あなたと試みる異なるのdirsに異なる値を出力/し、/tmp
ケント

2

これはおそらく最もクリーンなソリューションではありませんが、ドライブ間にハードリンクを作成できないという事実を利用できます。

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.