当您使用 mklink /D Link Target 创建符号链接时,真实数据存在于哪里?目标在哪里?硬链接怎么样?
我在我的机器上四处浏览,发现了一个悬空的符号链接,它似乎指向一个 IP 地址。
lrwxr-xr-x@ 1 greatone greatone 14 Oct 21 12:36 RunningChromeVersion -> 106.0.5249.119
为什么程序会创建这样的链接?
我有一个文件夹,里面有很多嵌套的文件夹和文件,就像典型的文件夹一样。虽然我在复制文件夹时遇到问题(进度只是冻结,直到资源管理器被杀死/重新启动),我发现这里和那里都有符号链接(使用 mklink / D 创建),问题可能是因为这些。有没有办法用符号链接复制所有内容?或者有没有其他方法可以创建不会产生复制问题的符号链接?
NTFS 支持各种链接,包括联结、硬链接、软链接等。所以这里有一个问题。
假设您正在递归删除一个实际包含上述内容的目录。很容易想象,您的应用程序,无论是什么,都不是删除所有的联结、可能导致您感兴趣的目录之外的软链接等,而是遍历它们并首先删除其中的所有文件。
这很容易导致重大数据丢失。
这是一个简单的例子。您安装了具有另一个 Windows 安装的硬盘驱动器。
让我们检查一下内容D:\ProgramData
:
D:\ProgramData>dir /a
Volume in drive D has no label.
Volume Serial Number is 1234-4321
Directory of D:\ProgramData
12/06/2021 12:56 PM <DIR> .
12/06/2021 12:56 PM <DIR> ..
07/14/2009 10:08 AM <JUNCTION> Application Data [C:\ProgramData]
07/14/2009 10:08 AM <JUNCTION> Desktop [C:\Users\Public\Desktop]
07/14/2009 10:08 AM <JUNCTION> Documents [C:\Users\Public\Documents]
07/14/2009 10:08 AM <JUNCTION> Favorites [C:\Users\Public\Favorites]
02/11/2016 03:51 PM <DIR> Microsoft
07/10/2019 03:00 AM <DIR> Microsoft Help
12/23/2019 04:04 PM <DIR> Package Cache
07/14/2009 10:08 AM <JUNCTION> Start Menu [C:\ProgramData\Microsoft\Windows\Start Menu]
07/14/2009 10:08 AM <JUNCTION> Templates [C:\ProgramData\Microsoft\Windows\Templates]
现在,如果您尝试递归删除D:\ProgramData
怎么办?我什至不会尝试这样做,因为我担心C:\ProgramData
会先被删除。
在 Linuxrm -rf
中完美地处理了这个 - 它看到符号链接(到目录)并将符号链接作为文件删除,而不试图遍历它们。
在 Windows 中递归删除此类目录的安全方法是什么?
rmdir /q /s
? 还有什么?
我使用 Ubuntu 20.04 LTS 并在 /etc/udev/rules.d/ 中编写了一个自定义 udev 规则,如果特定的外部 USB 硬盘驱动器是连接的。我的 udev 规则名为 99-datensicherung.rules:
ENV{DEVTYPE}=="usb_device", \
SUBSYSTEM=="usb", \
ATTRS{idVendor}=="174c", \
ATTRS{idProduct}=="55aa", \
ATTRS{bcdDevice}=="0100", \
SYMLINK+="mybackup", \
ACTION=="add", \
RUN+="/usr/bin/logger MY DEVICE CONNECTED."
如果我查看 syslog,我发现了 logger 的消息,并看到创建了符号链接:
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /etc/udev/rules.d/99-datensicherung.rules:9 LINK 'mybackup'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /etc/udev/rules.d/99-datensicherung.rules:9 RUN '/usr/bin/logger MY DEVICE CONNECTED.'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Handling device node '/dev/bus/usb/002/055', devnum=c189:182
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Setting permissions /dev/bus/usb/002/055, uid=0, gid=0, mode=0664
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Creating symlink '/dev/char/189:182' to '../bus/usb/002/055'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Creating symlink '/dev/mybackup' to 'bus/usb/002/055'
但不久之后,系统日志告诉我:
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: /usr/lib/udev/rules.d/69-libmtp.rules:2685 Running PROGRAM 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Starting 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: Successfully forked off '(spawn)' as PID 185132.
Okt 15 11:22:46 SWPITSLNB mtp-probe[185132]: checking bus 2, device 55: "/sys/devices/pci0000:00/0000:00:14.0/usb2/2-4"
Okt 15 11:22:46 SWPITSLNB mtp-probe[185132]: bus: 2, device: 55 was not an MTP device
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55'(out) '0'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Process 'mtp-probe /sys/devices/pci0000:00/0000:00:14.0/usb2/2-4 2 55' succeeded.
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: Updating old name, '/dev/mybackup' no longer belonging to '/devices/pci0000:00/0000:00:14.0/usb2/2-4'
Okt 15 11:22:46 SWPITSLNB systemd-udevd[185107]: 2-4: No reference left, removing '/dev/mybackup'
如何防止从其他 udev 规则中删除我的符号链接?非常感谢!
我有一个链接到嵌套图像文件夹(数千张图像)的软链接
(DRS) xzhan@4daf823ea86f:~$ ls -l voc12_root
lrwxrwxrwx 1 xzhan aiml 30 Mar 16 15:20 voc12_root -> /mnt/Data/Datasets/voc12_root/
我想将图像复制到其子文件夹之一中:
(DRS) xzhan@4daf823ea86f:~$ cp -r voc12_root/VOCdevkit/VOC2012/ ~/DRS_dataset
“cp”命令应该可以正常工作,但是在复制过程中似乎有些图像丢失了,我无法解决它。任何人都可以帮助我吗?
(DRS) xzhan@4daf823ea86f:~$ du -b voc12_root/VOCdevkit/VOC2012/
5341193450 voc12_root/VOCdevkit/VOC2012/superpixels
74008 voc12_root/VOCdevkit/VOC2012/ImageSets/Segmentation
2352400 voc12_root/VOCdevkit/VOC2012/ImageSets/Action
29596 voc12_root/VOCdevkit/VOC2012/ImageSets/Layout
7205056 voc12_root/VOCdevkit/VOC2012/ImageSets/Main
9665156 voc12_root/VOCdevkit/VOC2012/ImageSets
18642246 voc12_root/VOCdevkit/VOC2012/Annotations
9322572 voc12_root/VOCdevkit/VOC2012/SegmentationObject
1922590472 voc12_root/VOCdevkit/VOC2012/JPEGImages
9359317 voc12_root/VOCdevkit/VOC2012/SegmentationClass
8110414228 voc12_root/VOCdevkit/VOC2012/
(DRS) xzhan@4daf823ea86f:~$ du -b DRS_dataset/
1922565896 DRS_dataset/JPEGImages
7205056 DRS_dataset/ImageSets/Main
74008 DRS_dataset/ImageSets/Segmentation
2352400 DRS_dataset/ImageSets/Action
29596 DRS_dataset/ImageSets/Layout
9665156 DRS_dataset/ImageSets
1922565896 DRS_dataset/VOC2012/JPEGImages
7205056 DRS_dataset/VOC2012/ImageSets/Main
74008 DRS_dataset/VOC2012/ImageSets/Segmentation
2352400 DRS_dataset/VOC2012/ImageSets/Action
29596 DRS_dataset/VOC2012/ImageSets/Layout
9665156 DRS_dataset/VOC2012/ImageSets
5341172970 DRS_dataset/VOC2012/superpixels
9322572 DRS_dataset/VOC2012/SegmentationObject
9359317 DRS_dataset/VOC2012/SegmentationClass
18646342 DRS_dataset/VOC2012/Annotations
8110373268 DRS_dataset/VOC2012
5341172970 DRS_dataset/superpixels
9322572 DRS_dataset/SegmentationObject
9359317 DRS_dataset/SegmentationClass
18646342 DRS_dataset/Annotations
16220746536 DRS_dataset/
我使用这些 bash 脚本在 bin 目录中创建了指向 exe 文件的符号链接:
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cat do_links.sh
./make_links.sh as
./make_links.sh nm
./make_links.sh ar
./make_links.sh ranlib
./make_links.sh strip
./make_links.sh objdump
./make_links.sh ld
./make_links.sh gcov
./make_links.sh gcc-4.0.1
./make_links.sh gcc
./make_links.sh gprof
./make_links.sh gccbug
./make_links.sh g++
./make_links.sh c++
./make_links.sh strings
./make_links.sh c++filt
./make_links.sh size
./make_links.sh cpp
./make_links.sh readelf
./make_links.sh addr2line
./make_links.sh objcopy
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cat make_links.sh
ln -s arm-unknown-linux-gnu-$1 $1
然后我在 bin 目录中运行 ./do_links.sh ,这就是 bin 目录的样子:
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ lt
total 26552
-rwxr-xr-x 2 dan dan 2566199 May 30 16:44 arm-unknown-linux-gnu-as
-rwxr-xr-x 2 dan dan 1762396 May 30 16:44 arm-unknown-linux-gnu-nm
-rwxr-xr-x 2 dan dan 1706104 May 30 16:44 arm-unknown-linux-gnu-ar
-rwxr-xr-x 2 dan dan 1706099 May 30 16:44 arm-unknown-linux-gnu-ranlib
-rwxr-xr-x 2 dan dan 2203025 May 30 16:44 arm-unknown-linux-gnu-strip
-rwxr-xr-x 2 dan dan 2346625 May 30 16:44 arm-unknown-linux-gnu-objdump
-rwxr-xr-x 2 dan dan 2471491 May 30 16:44 arm-unknown-linux-gnu-ld
-rwxr-xr-x 1 dan dan 67493 May 30 16:44 arm-unknown-linux-gnu-gcov
-rwxr-xr-x 2 dan dan 201417 May 30 16:44 arm-unknown-linux-gnu-gcc-4.0.1
-rwxr-xr-x 2 dan dan 201417 May 30 16:44 arm-unknown-linux-gnu-gcc
-rwxr-xr-x 1 dan dan 2013095 May 30 16:44 arm-unknown-linux-gnu-gprof
-rwxr-xr-x 1 dan dan 16196 May 30 16:44 arm-unknown-linux-gnu-gccbug
-rwxr-xr-x 2 dan dan 206621 May 30 16:44 arm-unknown-linux-gnu-g++
-rwxr-xr-x 2 dan dan 206621 May 30 16:44 arm-unknown-linux-gnu-c++
-rwxr-xr-x 1 dan dan 1602788 May 30 16:44 arm-unknown-linux-gnu-strings
-rwxr-xr-x 1 dan dan 1692490 May 30 16:44 arm-unknown-linux-gnu-c++filt
-rwxrwxr-x 1 dan dan 12281 May 30 16:44 fix-embedded-paths
-rwxr-xr-x 1 dan dan 1620406 May 30 16:44 arm-unknown-linux-gnu-size
-rwxr-xr-x 1 dan dan 202864 May 30 16:44 arm-unknown-linux-gnu-cpp
-rwxr-xr-x 1 dan dan 398151 May 30 16:44 arm-unknown-linux-gnu-readelf
-rwxr-xr-x 1 dan dan 1727820 May 30 16:44 arm-unknown-linux-gnu-addr2line
-rwxr-xr-x 1 dan dan 2203026 May 30 16:44 arm-unknown-linux-gnu-objcopy
-rwxrwxr-x 1 dan dan 339 May 30 18:31 check_ver.sh
-rwxrwxr-x 1 dan dan 460 May 30 19:09 do_links.sh
-rwxr-xr-x 1 dan dan 129 May 30 19:13 make_links.sh
lrwxrwxrwx 1 dan dan 24 May 30 19:38 as -> arm-unknown-linux-gnu-as
lrwxrwxrwx 1 dan dan 24 May 30 19:38 nm -> arm-unknown-linux-gnu-nm
lrwxrwxrwx 1 dan dan 28 May 30 19:38 ranlib -> arm-unknown-linux-gnu-ranlib
lrwxrwxrwx 1 dan dan 24 May 30 19:38 ar -> arm-unknown-linux-gnu-ar
lrwxrwxrwx 1 dan dan 27 May 30 19:38 strip -> arm-unknown-linux-gnu-strip
lrwxrwxrwx 1 dan dan 29 May 30 19:38 objdump -> arm-unknown-linux-gnu-objdump
lrwxrwxrwx 1 dan dan 24 May 30 19:38 ld -> arm-unknown-linux-gnu-ld
lrwxrwxrwx 1 dan dan 26 May 30 19:38 gcov -> arm-unknown-linux-gnu-gcov
lrwxrwxrwx 1 dan dan 31 May 30 19:38 gcc-4.0.1 -> arm-unknown-linux-gnu-gcc-4.0.1
lrwxrwxrwx 1 dan dan 25 May 30 19:38 gcc -> arm-unknown-linux-gnu-gcc
lrwxrwxrwx 1 dan dan 27 May 30 19:38 gprof -> arm-unknown-linux-gnu-gprof
lrwxrwxrwx 1 dan dan 28 May 30 19:38 gccbug -> arm-unknown-linux-gnu-gccbug
lrwxrwxrwx 1 dan dan 25 May 30 19:38 g++ -> arm-unknown-linux-gnu-g++
lrwxrwxrwx 1 dan dan 25 May 30 19:38 c++ -> arm-unknown-linux-gnu-c++
lrwxrwxrwx 1 dan dan 29 May 30 19:38 strings -> arm-unknown-linux-gnu-strings
lrwxrwxrwx 1 dan dan 29 May 30 19:38 c++filt -> arm-unknown-linux-gnu-c++filt
lrwxrwxrwx 1 dan dan 26 May 30 19:38 size -> arm-unknown-linux-gnu-size
lrwxrwxrwx 1 dan dan 25 May 30 19:38 cpp -> arm-unknown-linux-gnu-cpp
lrwxrwxrwx 1 dan dan 29 May 30 19:38 readelf -> arm-unknown-linux-gnu-readelf
lrwxrwxrwx 1 dan dan 31 May 30 19:38 addr2line -> arm-unknown-linux-gnu-addr2line
lrwxrwxrwx 1 dan dan 29 May 30 19:38 objcopy -> arm-unknown-linux-gnu-objcopy
所以我可以在该目录中执行符号链接:
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ gcc --version
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
但是当我尝试在其他任何地方执行符号链接时:
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cd ..
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu$ bin/gcc --version
bash: bin/gcc: No such file or directory
只是为了好玩,我在 bin 目录中创建了一个 bash 脚本:
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ echo "gcc --version" > check.sh
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ chmod +x check.sh
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ ./check.sh
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin$ cd ..
dan@Linux-Desktop:~/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu$ bin/check.sh
gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
它可以在任何其他目录中正常工作。
然后我认为它与其他gcc冲突并将链接名称更改为gcc2:
dan@Linux-Desktop:~$ which gcc
/usr/bin/gcc
dan@Linux-Desktop:~$ which gcc2
/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/gcc2
dan@Linux-Desktop:~$ gcc2 --version
bash: /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/gcc2: No such file or directory
我什至无法从任何其他目录运行显式 exe:
dan@Linux-Desktop:~$ cat testd.sh
ls -ltr /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc --version
dan@Linux-Desktop:~$ ./testd.sh
-rwxr-xr-x 2 dan dan 201417 May 30 16:44 /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
./testd.sh: line 2: /home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc: No such file or directory
dan@Linux-Desktop:~$
这是我的PATH
:
dan@Linux-Desktop:~$ printenv PATH
/home/dan/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/dan/java/jdk-11.0.11+9/bin:/home/dan/dev/arm/gcc-4.0.1-glibc-2.3.5/arm-unknown-linux-gnu/bin
删除 Robocopy 备份是否安全?我读到有些人不小心删除了备份之外的文件,因为它包含链接/连接。我可以防止这种情况吗?
如果我在当前文件夹中创建一个文件夹,请说日志:-
mkdir log
ln -s -f log all_logs
这样 all_logs 指向日志目录。
ls -ltr
Jan 7 23:33 log
Jan 7 23:33 all_logs -> log
当我再次运行时,会在ln -s -f log all_logs
日志目录中创建一个递归符号链接,名为 log。
ls -ltr log/
Jan 7 23:33 log -> log
为什么会这样?现有的符号链接不应该只取消链接和重新链接(使用 -f 选项)吗?为什么会发生这种递归行为?