如果存在,mkdir -p 将返回错误

如果存在,mkdir -p 将返回错误

Raspbian Stretch Lite:

$ mkdir --help
Usage: mkdir [OPTION]... DIRECTORY...
Create the DIRECTORY(ies), if they do not already exist.

Mandatory arguments to long options are mandatory for short options too.
  -m, --mode=MODE   set file mode (as in chmod), not a=rwx - umask
  -p, --parents     no error if existing, make parent directories as needed
  -v, --verbose     print a message for each created directory
  -Z                   set SELinux security context of each created directory
                         to the default type
      --context[=CTX]  like -Z, or if CTX is specified then set the SELinux
                         or SMACK security context to CTX
      --help     display this help and exit
      --version  output version information and exit

在我写的脚本中:

mkdir -p /mnt/target/home/user/resources

哪里/mnt/target/home/user/resources可能存在。如果是这种情况,脚本将停止并出现以下错误:

mkdir:无法创建目录“/mnt/target/home/user/resources”:文件存在

但手册页说如果它存在它不应该返回错误!

更新

不存在resources文件:

$ ls -la /mnt/target/home/user/
totale 13
drwxr-xr-x 4 mark      mark      1024 gen 10 16:56 .
drwxr-xr-x 4 root      root      1024 gen 10 16:56 ..
-rw-r--r-- 1 mark      mark       220 nov 13 14:09 .bash_logout
-rw-r--r-- 1 mark      mark      3523 nov 13 14:09 .bashrc
drwxr-xr-x 3 root      root      1024 gen 10 16:56 bin
-rw-r--r-- 1 mark      mark       675 nov 13 14:09 .profile
drwxr-xr-x 2 root      root      4096 gen  1  1970 resources

更新2

这是脚本中的周围代码:

losetup -P /dev/loop0 image.img
e2fsck -f /dev/loop0p2
resize2fs /dev/loop0p2
mkfs.ext4 /dev/loop0p3
e2fsck -f /dev/loop0p3
mkfs.vfat -F 32 /dev/loop0p4

mount /dev/loop0p2 /mnt/target

cd /mnt/target/home/
tar cf home.tgz user/
rm -r user/

mount /dev/loop0p1 /mnt/target/boot/
mount /dev/loop0p3 /mnt/target/home/

tar xf home.tgz -C /mnt/target/home/

#mkdir -p /mnt/target/home/user/resources
mount /dev/loop0p4 /mnt/target/home/user/resources

image.img包含 4 个分区。

答案1

mount /dev/loop0p2 /mnt/target
cd /mnt/target/home/
mount /dev/loop0p3 /mnt/target/home/
mkdir -p /mnt/target/home/user/resources

您正在mkdir将工作目录设置为/homeon进行调用/dev/loop0p2。该工作目录以前可以通过路径访问/mnt/target/home,但现在隐藏在/dev/loop0p3.当您调用时mkdir,路径指的是上的/mnt/target/home目录。//dev/loop0p3

我不明白为什么mkdir会关心它的工作目录,但这看起来很奇怪。如果您在问题中显示脚本之前已经简化了脚本,那么您遇到的问题很可能是由于隐藏在挂载点后面的目录造成的混乱造成的。

所以在安装之前先尝试cd退出。或者根本/mnt/target/home不使用并使用调用选项和.cd-Ctarrm

作为一般规则,请避免将某些内容安装到以任何方式使用的目录中。目标目录应该为空,并且不应该是任何进程的工作目录。操作系统会做正确的事情,但它认为正确的事情可能会令人惊讶,并且无论如何这都会使人类和软件感到困惑。

相关内容