web-dev-qa-db-ja.com

「$」で始まるフォルダを削除するにはどうすればよいですか?

「$ pattern」という名前のディレクトリを作成し、今それを削除しようとすると、それは言う

パターン:未定義の変数。

私が試してみました:

$ rm -r $pattern
$ rm -rf $pattern
$ rm "$ option[value='2016']"

$、スペース、'および[は、ほとんどのシェルの特殊文字です。それらの特別な意味を取り除くには、シェルの引用メカニズムを使用する必要があります。

引用構文はシェルによって大きく異なります

私が知っているすべてのシェルでは、単一引用符を使用して、単一引用符、バックスラッシュ、および改行以外のすべての文字を引用できます(Bourneのようなシェルでは、最後の2つも同様に引用しますが、一部の\のバッククォートは除きます) )。

rm -r '$pattern'

ほとんどの一般的なシェルで動作するはずです。

rm -r \$pattern

rcファミリーのシェル以外のすべてのシェルで動作します(Bourneのようなものの内部のバックティックを除く)。

同じ:

rm "\$option[value='2016']"

rcのようなシェルでは、次のように使用します。

rm '$option[value=''2016'']'
21

ディレクトリが空の場合:

rmdir \$pattern

さもないと:

rm -r \$pattern

(フォルダに含まれるファイルは再帰的に削除されます)

16
Mc Kernel

特殊文字を含むファイルを操作する必要がある場合、オプションはbashオートコンプリート機能を使用することです。コマンド(この場合はrmdir)を入力してから、 Tab 数回。これにより、現在のディレクトリ内のすべてのファイル/ディレクトリが循環し、すべての特殊文字が自動的にエスケープされます。

これは、非常に長いファイル名を操作している場合にもうまく機能します。

3
dr_

他のすべてが失敗した場合は、iノード番号に基づいてファイルを削除できます。最初に、現在のディレクトリ内のすべてのファイルをiノード番号で一覧表示します。

ls-il

次に、対応するファイル名の出力の最初の番号を使用して、次のコマンドを使用して、iノード番号に基づいて削除できます。

find . -inum [inode-number] -exec rm -i {} \;

$ ls -il
total 0
804743 -rw-r--r--  1 staff  0 Nov  2 19:49 test1
804744 -rw-r--r--  1 staff  0 Nov  2 19:49 test2

$ find . -inum 804743 -exec rm -i {} \;
remove ./test1? y

$ ls -il
total 0
804744 -rw-r--r--  1  staff  0 Nov  2 19:49 test2
0
StephenH

「\」を使用して文字をエスケープするだけです。これは、WebアプリケーションでSQLクエリを記述して、意図したもの以外のデータベースコマンドが実行されないようにするための一般的な方法でもあります。

0
Isaac C. Weiner