我的目录中只有三个文件/子目录
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 '*/\.*'
过滤掉它们?有两个问题:
*/\.*
仅匹配诸如 之类的内容./.bashrc
,而不是当前目录条目.
运算符优先级规则(具体来说,逻辑 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