![終了括弧 ')' を除いたディレクトリを検索します](https://rvso.com/image/83705/%E7%B5%82%E4%BA%86%E6%8B%AC%E5%BC%A7%20')'%20%E3%82%92%E9%99%A4%E3%81%84%E3%81%9F%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%BE%E3%81%99.png)
たとえば、年で終わらない(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]
一致します。 、、または以外のいずれにも一致します。したがって以外のいずれにも一致します。)a
b
c
[^abc]
a
b
c
[^\)]
)
方法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' *[!\)]/
ディレクトリのみに一致させます。ただし、展開結果に末尾のスラッシュが追加されます。 directory を使用するとfoo
、 になりますfoo/
。