我在 Unix 文件夹中有 10 个扩展名为 .txt 的文件。在这里,我需要获取除 fgh.txt (任何一个)文件之外的所有文件。什么是 UNIX 命令?
1.abc.txt
2.bcd.txt
3.cde.txt
4.def.txt
5.efg.txt
6.fgh.txt
7.ghi.txt
8.hij.txt
9.ijk.txt
10.jkl.txt
这里我需要获取除 file 之外的所有文件6.fgh.txt
。什么是 UNIX 命令?
答案1
和寻找命令:
find . -type f -name "*.txt" ! -name "fgh.txt"
-name "*.txt"
- 查找名称与模式对应的文件(所有txt文件)! -name "fgh.txt"
- 除了确切的文件名fgh.txt
如果您的文件确实以数字为前缀(我不确定该问题的编辑),请将否定条件更改为! -name "*fgh.txt"
答案2
这外部全局变量bash 的选项可以解决这个问题:
bash 手册页中描述的扩展通配符:
?(pattern-list)
匹配零次或一次出现的给定模式
*(pattern-list)
匹配零次或多次出现的给定模式
+(pattern-list)
匹配一次或多次出现的给定模式
@(pattern-list)
匹配给定模式之一
!(pattern-list)
匹配除给定模式之一之外的任何内容
您需要的命令(排除任何*fgh.txt
文件):
shopt -s extglob
ls -d -- !(*fgh).txt
如果您想根据完整文件名排除特定文件:
ls -d -- !(6.fgh.txt)
答案3
简单而优雅(假设是 GNU ls
):
ls -I fgh.txt
答案4
如果您希望将文件列表放入数组中,则zsh
有以下几种选择:
setopt extendedglob # best in ~/.zshrc
# using the negation glob operator:
files=((^*fgh).txt)
# using the "except" glob operator:
files=(*.txt~*fgh*)
# trimming entries from the array afterwards:
files=(*.txt)
files=(${files:#*fgh*})
然后根据需要使用您的数组:
ls -ld -- $files