假设我有一个包含.txt、.pdf和其他文件的文件夹。我想列出“其他”文件(即没有扩展名的文件.txt或.pdf)。你对如何做到这一点有什么建议吗?
我知道如何列出没有给定扩展名的文件。例如,如果我想列出除.txt文件之外的所有文件,那么要么
find -not -iname "*.txt"
Run Code Online (Sandbox Code Playgroud)
或者
ls | grep -v '\.txt$' | column
Run Code Online (Sandbox Code Playgroud)
似乎工作。但是,如何列出除.txt文件或 .pdf文件之外的所有内容?似乎我需要在findor 中使用某种逻辑“或” grep。
小智 45
假设有 GNU ls,这可能是最简单的方法:
ls -I "*.txt" -I "*.pdf"
Run Code Online (Sandbox Code Playgroud)
如果要遍历所有子目录:
ls -I "*.txt" -I "*.pdf" -R
Run Code Online (Sandbox Code Playgroud)
der*_*ert 36
寻找支持 -o
find . ! '(' -name '*.txt' -o -name '*.pdf' ')'
Run Code Online (Sandbox Code Playgroud)
您需要括号来使优先级正确。Find 做了很多事情;我建议阅读它的联机帮助页。
您也可以执行 an or in grep(但实际上,您不应该解析 的输出ls)
ls | grep -Ev '\.(txt|pdf)$' | column
Run Code Online (Sandbox Code Playgroud)
jw0*_*013 15
使用bash扩展shopt -s extglob通配符(使用 开启),通配符!(*.txt|*.pdf)应该可以工作。您可以将此 glob 直接传递给任何采用文件参数的命令,包括但不限于ls.
在zsh与extendedglob:
print -rl -- *~*.(txt|pdf)
Run Code Online (Sandbox Code Playgroud)
或者
print -rl -- ^*.(txt|pdf)
Run Code Online (Sandbox Code Playgroud)
或者使用kshglob(是的,那是 ksh globbing 而不是“bash 扩展的 globbing”):
print -rl -- !(*.txt|*.pdf)
Run Code Online (Sandbox Code Playgroud)
请记住,那些也排除点文件。
ksh93 具有FIGNORE(错误)功能:
FIGNORE='@(.|..|*.txt|*.pdf)'
printf '%s\n' *
Run Code Online (Sandbox Code Playgroud)
小智 5
find /path/to/directory '!' -name '*.pdf' '!' -name '*.txt'
Run Code Online (Sandbox Code Playgroud)
由于德摩根定律,这等效于带有 OR 运算符的命令。
| 归档时间: |
|
| 查看次数: |
124406 次 |
| 最近记录: |