サフィックスが付いた他のファイルを含まないファイルのリスト

サフィックスが付いた他のファイルを含まないファイルのリスト

次のファイルを含むディレクトリを考えてみましょう。

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

.signeddnssecが有効になっていない領域、つまり拡張子を持つ他のファイルがないファイルを一覧表示しようとしています。

私の試みは次のとおりです。

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

短いかどうかはわかりませんが、シェルでは簡単です(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

関連情報