同一文件夹中具有相同名称的两个文件 - 需要删除一个但不能同时删除

同一文件夹中具有相同名称的两个文件 - 需要删除一个但不能同时删除

文件夹中似乎有两个/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

同一文件夹中不能有两个同名的文件。其中可能有一个不可见的字符(例如尾随空格)。

我的建议是重命名requestsrequests.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

相关内容