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
あります。NOMATCH
failglob
bash
いいえこのシェルではデフォルトで設定されています)。これにより、ワイルドカードパターンが一致するものがない場合、診断メッセージとともにシェルが失敗します。もちろん、このシェルオプションをオフにすることもできますが(または使用)、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 -c
zsh -c
find
本当に削除したい場合は、他のオプションがありますみんなディレクトリの内容はディレクトリ全体を削除するだけです。
sudo rm -rf directoryname
その後、正しい所有権と権限で再作成してください。