閉じカッコ ')'を含まないディレクトリを探す

閉じカッコ ')'を含まないディレクトリを探す

年で終わらないすべてのビデオディレクトリ(ファイルではない)を一覧表示しようとしています。たとえば、(2015)より具体的には、年はリストされていないため、閉じ括弧で終わらないでください)

次の方法とは逆にするにはどうすればよいですか?

# List all files and directories end with '(2015)'
ls -ld *\(2015\)

# List all files and directories end with ')'
ls -ld *\)

誰もがこれを行う方法を説明するのに役立ちますか?

答え1

この試み:

ls -ld *[^\)]

[] - 興味のある文字セット

^ - 否定(不要な文字セットを含む)

\) - 脱出する ')'

答え2

Bashまたはzshから:

for i in *; do [ -d "$i" ] && [[ ! "$i" =~ \)$ ]] && printf "%s\n" "$i"; done

これは、単に現在のディレクトリ内のすべてのファイルとディレクトリを繰り返し、i)ディレクトリであるか(ii)名前が(で[ -d "$i" ])終わっていないことを確認します)、両方のテストに合格したエントリが印刷されます。)[[ ! "$i" =~ \)$ ]]

これにより、任意のファイル名を処理できます(lsできないこと)。

答え3

方法1a:

ls -ld -- *[^\)]

(パス名拡張(ワイルドカード/グローバル)パターンを使用::[…]、または;、またはを除くすべての項目と一致します。したがって、を除くすべての項目と一致します。)[abc]abc[^abc]abc[^\)])

方法2a:

GLOBIGNORE="*)"
ls -ld -- *

かなり自明ですか?

どちらの方法も、ディレクトリではなくファイルやその他のオブジェクトと一致します。


ディレクトリだけを見つけるようにdon_crisstiが提案したように更新されました。

方法1b:

ls -ld -- *[^\)]/

方法2b:

GLOBIGNORE="*)/"
ls -ld -- */

/値にを含める必要がありますGLOBIGNORE

答え4

POSIX的に:

find . ! -name . -prune -type d ! -name '*)'

そしてzsh

print -rl -- *[^\)](/)

Bourneなどの他のシェルはワイルドカードの結果をフィルタリングできません。あなたはそれを使用することができます:

printf '%s\n' *[!\)]/

ディレクトリにのみ一致します。ただし、拡張結果に末尾のスラッシュが追加されます。目次を使用すると、foo取得できますfoo/

関連情報