仅当目标位于同一驱动器上时,如何使用mv在UNIX中移动文件夹


10

我需要使用unix mv命令移动文件夹,但前提是目标位于同一驱动器或同一文件系统中。最好的方法是什么?

linux  bash  shell  unix  mv 

1
开车到这里你是指“设备”吗?例如相同的硬盘?
肯特

同一台设备,是的

Answers:


9

基于如何检查两个目录或文件是否属于同一文件系统https://unix.stackexchange.com/):

在Linux上的Shell脚本中,可以使用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发行版之间兼容吗?

只是为了传播更好的做法,请使用$(...)代替`...`。不推荐使用后者,而推荐使用前者。
2013年

感谢@Shahbaz,根据您的建议对其进行了编辑!
fedorqui

@zapp我不知道,应该测试一下。我的经验stat告诉我,有时候使用SunOS有时会有些棘手。但是我希望它是Linux兼容的。使用我的Ubuntu 12很好。
fedorqui 2013年

这会%d为不同的目录(甚至是相同的分区)输出不同的值,请尝试使用//tmp
Kent

2

这可能不是最干净的解决方案,但是您可以使用以下事实:无法在驱动器之间创建硬链接。

ln /path1/file /path2/file 2> /dev/null
if [[ $? == 0 ]]
then
    rm /path1/file
fi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.