zshを使用するときに正規表現をコマンドに渡す

zshを使用するときに正規表現をコマンドに渡す

Bashでは、次のことができます。

apt install blabla*

しかしzshでは

zsh: no matches found: blabla*

現在のディレクトリにblablablaというファイルがない場合。

ファイルを削除すると問題が発生する可能性があります。以内にフォルダへの書き込みに sudo アクセスが必要な場合は、フォルダ自体を削除する必要はありません。

zshに正規表現をコマンドに渡すにはどうすればよいですか?

答え1

ファイル名ワイルドカードパターンは正規表現ではありません。彼ら似たようなただし、ワイルドカードパターンはblabla*文字列で始まる名前と一致しますblablaが、正規表現はblabla*部分文字列blabl(おそらくゼロ以上のa文字が続く可能性がある)を含む文字列と一致します。

文字列を次のように使用せずにシェルにblabla*引数として渡します。apt installファイル名ワイルドカードパターン、これを引用すると次のようになります。

apt install 'blabla*'

デフォルトでは、シェルには次のシェルオプションセットがzshあります。NOMATCHfailglobbashいいえこのシェルではデフォルトで設定されています)。これにより、ワイルドカードパターンが一致するものがない場合、診断メッセージとともにシェルが失敗します。もちろん、このシェルオプションをオフにすることもできますが(または使用)、unsetopt NOMATCHアクセスできないファイルを削除してもsetopt NO_NOMATCH役に立ちません。sudo

このようなファイル名パターンを拡張するにはbla/*シェルが必要です(rmコマンド自体はシェルグロービングパターンを拡張できず、コマンドがほとんどないため、sudo rm -rf bla/*現在のシェルがパターンを参照して拡張しようとするのを防いでも機能しません)。 。ディレクトリの名前を読み取る権限がない可能性があるため、blaシェルは次のユーザーとして実行する必要があります。するルートなどのディレクトリの名前を読み取る権限があります。 rootユーザーとしてシェルを実行できますsudo

アクセス権のないディレクトリ内のすべてのファイルとディレクトリを削除するには、次の手順を使用しますsudo

sudo sh -c 'rm -rf directoryname/*'

これにより、隠された名前は削除されません。これを行うには、次の方法を使用します。

sudo bash -O dotglob -c 'rm -rf directoryname/*'

または

sudo zsh -c 'rm -rf directoryname/*(D)'

または

sudo find directoryname -mindepth 1 -delete

または標準を使用findして

sudo find directoryname -depth ! -path directoryname -exec rm -rf {} +

最初の3つのコマンドはrootユーザーが実行したりsh -cシェルで実行したりするときにglobbingに依存しますが、最後の2つのコマンドはファイル名globbingをまったく使用しません。のバリエーションは、何千ものファイルを含むディレクトリの削除もサポートしています(グロービングを試みると、「パラメータリストが長すぎます」というエラーが発生する可能性があります)。bash -czsh -cfind

本当に削除したい場合は、他のオプションがありますみんなディレクトリの内容はディレクトリ全体を削除するだけです。

sudo rm -rf directoryname

その後、正しい所有権と権限で再作成してください。

関連情報