![同一文件夹中具有相同名称的两个文件 - 需要删除一个但不能同时删除](https://linux22.com/image/100976/%E5%90%8C%E4%B8%80%E6%96%87%E4%BB%B6%E5%A4%B9%E4%B8%AD%E5%85%B7%E6%9C%89%E7%9B%B8%E5%90%8C%E5%90%8D%E7%A7%B0%E7%9A%84%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%20-%20%E9%9C%80%E8%A6%81%E5%88%A0%E9%99%A4%E4%B8%80%E4%B8%AA%E4%BD%86%E4%B8%8D%E8%83%BD%E5%90%8C%E6%97%B6%E5%88%A0%E9%99%A4.png)
文件夹中似乎有两个/var/spool/lp/logs
名为“requests”的文件。一个属于 lp,另一个属于 root。
我们需要删除 root 拥有的 requests 文件 - 我们如何引用它?
这是命令的输出ls -l
:
-rw-r--r-- 1 root sys 0 Jan 30 2014 lp
-rw-rw---- 1 root lp 6584 Nov 4 06:10 lpsched
-rw-rw---- 1 lp lp 3365 Dec 14 10:56 requests
-rw-r--r-- 1 root sys 1668416 Dec 14 10:41 requests
drwxr-xr-x 2 root sys 1024 Sep 30 2013 requests.archives
答案1
如果你有 GNU ls,你可以运行ls -lQ
来查看文件名的引用版本:
$ ls -lQ
total 0
-rw-r--r--. 1 user group 0 Dec 14 14:32 "requests"
-rw-r--r--. 1 user group 0 Dec 14 14:32 "requests "
要删除特定文件,请首先使用以下命令查找其索引节点号ls -li
:
$ touch 'requests' 'requests '
$ ls -li
total 0
440 -rw-r--r--. 1 user group 0 Dec 14 14:32 requests
441 -rw-r--r--. 1 user group 0 Dec 14 14:32 requests
这里我们有两个相似的文件,一个有 inode 440,另一个有 441(左栏)。
对于您的情况,找到 root 拥有的文件并获取该 inode 号。-xdev
(或-mount
) 选项表示find
保留在同一文件系统上,以防万一您在当前目录下安装了文件系统,以避免捕获该子文件系统中匹配的任何文件。
然后:
$ find . -inum 441 -xdev -user root -ls
441 0 -rw-r--r-- 1 user group 0 Dec 14 14:32 ./requests\
请注意,find
末尾引用了空格字符。
并删除:
$ find . -inum 441 -xdev -user root -delete # GNU find
或者
$ find . -inum 441 -xdev -user root -exec rm {} \; # otherwise
答案2
同一文件夹中不能有两个同名的文件。其中可能有一个不可见的字符(例如尾随空格)。
我的建议是重命名requests
为requests.real
,然后运行交互式删除。您可以选择删除不需要的名称,然后(如有必要)使用通配符将另一个重命名为正确的名称
mv requests requests.real # STOP if this fails
mv requests.archives KEEP.archives # Temporary
rm -i req* # Interactive delete: "y" to delete, "n" to skip
mv req* requests # Rename whatever's left that begins "req"
mv KEEP.archives requests.archives # Put this one back again