查找命令包含目录中不存在的文件

查找命令包含目录中不存在的文件

我的目录中只有三个文件/子目录

root@acd95b24dde6:~# ls -l
total 1048
-rw-r--r-- 1 root root 1067355 Sep  6 12:57 apollo13.txt
-rw-r--r-- 1 root root       6 Sep 12 22:02 out.txt
drwxr-xr-x 4 root root     128 Sep 13 00:47 submission

然而,当我调用 find 时,它返回我

root@acd95b24dde6:~# find -maxdepth 1 -type f -o -type d -not -perm -o=rw -not -path '*/\.*'
.
./.bash_history
./apollo13.txt
./out.txt
./submission

我该如何删除多余的文件?

答案1

事实上目录中的文件 -ls默认情况下,它会忽略隐藏文件(“点文件”),除非您添加-a-A选项。来自man ls

   -a, --all
          do not ignore entries starting with .

   -A, --almost-all
          do not list implied . and ..

前任。

$ ls -l
total 0
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 apollo13.txt
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 out.txt
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 submission

然而

$ ls -Al
total 0
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 .bash_history
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 apollo13.txt
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 out.txt
-rw-r--r-- 1 steeldriver steeldriver 0 Sep 13 07:29 submission

与 不同ls,该find命令不会省略点文件或目录:

$ find . -type f -o -type d
.
./.bash_history
./apollo13.txt
./out.txt
./submission

那么 - 为什么添加不能-not -path '*/\.*'过滤掉它们?有两个问题:

  1. */\.*仅匹配诸如 之类的内容./.bashrc,而不是当前目录条目.

  2. 运算符优先级规则(具体来说,逻辑 AND 比 OR 约束力更强)意味着

    find . -type f -o -type d -not -path '*/.*'
    

    解析为

    find . -type f -o \( -type d -not -path '*/.*' \)
    

    因此-not -path测试仅适用于目录 - 由于问题 (1),它不匹配。

您可以通过使用简单-name测试代替-path测试来解决问题 (1),并使用显式分组来解决问题 (2):

$ find . \( -type f -o -type d \) -not -name '.*'
./apollo13.txt
./out.txt
./submission

相关内容