列出不包含其他带有后缀的文件的文件

列出不包含其他带有后缀的文件的文件

考虑一个包含以下文件的目录:

file1
file1.suffix
file2
file3
file3.suffix

我需要列出所有文件,以便不存在具有相同名称和已知后缀的另一个文件。在上面的示例中,仅匹配file2.

这就是我想出的:

diff --new-line-format= --unchanged-line-format= \
    <(ls -I '*.suffix' | sort) \
    <(ls *.suffix | sed 's/\(.*\)\.suffix/\1/' | sort)

有没有更简单、更短的方法?

编辑1

在我的具体案例中,实际上有多个后缀(绑定区域文件/w dnssec):

example.org
example.org.jbk
example.org.jnl
example.org.signed
example.org.signed.jnl
example.com

我正在尝试列出未启用 dnssec 的区域,即没有其他带.signed扩展名的文件的文件。

这是我的尝试:

diff --new-line-format= --unchanged-line-format= \
    <(ls -I '*.jbk' -I '*.jnl' -I '*.signed' -I '*.signed.jnl' | sort) \
    <(ls *.signed | sed 's/\(.*\)\.signed/\1/' | sort)

答案1

zsh

setopt extendedglob # for the first "^" below
ls -ld -- ^*.suffix(^e:'[[ -e $REPLY.suffix ]]':)

(或者如果您只想考虑无扩展名文件,或者在更新您的问题或或之后,请使用^*.*而不是...)^*.suffix*.(org|net|com)^*.*.*^*.(signed|jnl|jbk)

即列出不存在的非.suffix文件,使用glob 限定符根据某些代码的评估来选择文件(其中包含要选择的文件的路径)。file.suffixee$REPLY

另一种方法是使用${a:|b}数组减法运算符(助记符:元素a 酒吧的那些b):

bare=(^*.suffix(N))
with_suffix=(*.suffix(N:r))
ls -ld -- ${bare:|with_suffix}

ls -ld --此处仅用作示例命令,您可以使用任何其他命令或将列表存储在数组中,例如:

without_suffix=(${bare:|with_suffix})

答案2

由于您当前的文件列表具有简单的命名约定 - 这是简短的++ls方法:cutuniq

ls -v1 * | cut -d'.' -f1 | uniq -u

答案3

不知道是否更短,但在 shell 中很简单(Bash 和 zsh 快速测试过):

for f in * ; do 
    [[ $f != *.suffix ]] && ! [[ -f "$f.suffix" ]] && echo "$f"
done

(或替换echo为合理的东西)

或者与多个后缀相同:

suffixes=(suffix postfix)
for f in * ; do 
    for s in "${suffixes[@]}" ; do 
        [[ $f == *".$s" ]] || [[ -f "$f.$s" ]] && continue 2
    done
    echo "$f"
done

相关内容