名前が一重引用符で始まるすべてのファイルを削除します

名前が一重引用符で始まるすべてのファイルを削除します

次の名前のファイルをすべて削除する必要があります (引用符は名前の一部です)。

'index.html?some-query-string'

私は以下を試しました:

rm \'index.html?*\'

次のエラーが発生します:

rm: cannot remove ''\''index.html?*'\''': No such file or directory

答え1

分析

引用符は名前の一部です

本当に?どうしてわかるの?これがある現代のGNUの「機能」ls、内部に のような文字がある名前には、追加の引用符が付きます?。そのため、まったくの素人がコピー アンド ペーストし'index.html?some-query-string'て実行するとrm 'index.html?some-query-string'、これは正しい安全なコマンドになります。

残念ながら、一部の文字を引用符/エスケープする必要があることを知っている、より経験豊富なユーザーを混乱させる可能性があります。コマンドrm( rm \'index.html?*\') は、引用符付きの名前には適しています。これは、?*glob パターンであるため、より多くのファイル名に一致する可能性があります。「すべてのファイルを削除する必要がある」と書かれているので、これが必要な操作だと思います。コマンドが示した事実から、No such file or directory既存の名前は確かに異なるものだと思います。

これを確認するには、 を実行しますls -N。このコマンドが成功し、次のような名前が出力された場合は、index.html?some-query-string 引用符なしそれからこれら実名です。


解決

回答のこの部分では、お使いのシステムlsが最新の GNUlsまたは同様に「スマート」であると想定しているため、問題の引用符はファイル名に属していません。

'index.html?some-query-string'特定のファイルを削除するには、 "smart" の出力を見る完全な素人として行動するか、引用符の必要性を認識しているユーザー (あなたはそうだと思います) として、出力をls見るようにしてください。次を実行します。index.html?some-query-stringls -N

rm 'index.html?some-query-string'

または、名前が で始まるすべてのファイルを削除する場合index.html?:

rm 'index.html?'*

シェルは引用符を削除するので、 には到達しませんrm。一重引用符は?ワイルドカードとして扱われず、文字どおりに に渡されますrm。引用符なしは*ワイルドカードとして扱われ、任意のクエリ文字列と一致し、シェルは一致するファイル名を複数引数として に渡しますrm

答え2

'がファイル名の一部である場合は、" "コマンドの名前パターンを渡すために find コマンドを一緒に使用することをお勧めします。

使用できる例は次のとおりです。

find . -maxdepth 1 -type f -name "'index.html?*'" -exec rm {} \;

関連情報