再帰 rm が機能しない

再帰 rm が機能しない

ディレクトリに次のファイルがあるとします。

test.txt
test.txt~
/subdir
  test1.txt
  test1.txt~

rm -r ./*.*~最上位ディレクトリで実行すると、test.txt〜のみが削除されます。

再帰フラグを使用していますが、なぜ再帰削除を実行しないのですか?

次のスクリプトを使用して自分のケースを再現できます。

#create dir and 1-st level test files
mkdir dir
cd dir
touch test.txt
touch test.txt~

#create subdir and 2-nd level test files
mkdir subdir
cd subdir/
touch test1.txt~
touch test1.txt

cd ..
rm -r ./*.*~

ベストアンサー1

あなたのものrm -r *.*~(と同じ)は、一致するファイルとディレクトリ、つまり名前にドットが含まれ、次に終わるファイルとディレクトリをrm -r ./*.*~削除します。*.*~~

ところがsubdirポイントが一つもなくて合わないですね。

読むグローバル(7)/bin/rm次のことはシェル(プログラムではありません!)であることを覚えておいてください。ワイルドカード

それでは、rm -r ./*.*~シェルに何かを入力すると何が起こりますか?あなたのシェルはこれをに拡張し、次を呼び出しますrm -r ./test.txt~/bin/rm$PATHフォーク(2)子プロセスを作成してから実行(2)/bin/rmプログラムでは、パラメータ配列は見えなくなりますrm -rf ./test.txt~rm./subdir

すぐ下のサブディレクトリにあるすべてのバックアップファイルを削除するにはrm */*.*~最近 bash(バージョン4以降)、zshファイルツリーの深い場所にあるバックアップファイルを削除することもできます。rm **/*.*

シェルが何をするのかを理解するための1つの可能な方法は、rmコマンド(例えば)ですechoエコ(1)echoいくつかのオプションが知られているためです(例-n:)。いくつかの良い殻では、tabキーを使用することもできます。オートコンプリート。私はそれを使用しています扱いにくいオートコンプリート機能が好きなので、インタラクティブシェルとして使用しました。

最後に、部屋(1)理解してください-i(削除する前にインタラクティブに聞いてください)。だから私が提案するrm -i **/*~

ちなみに、バージョン管理システムがわからない場合は、今学ぶ時間です。....)、特にファイル(CまたはPythonプログラム、シェルスクリプトなど...)などの「ソース」コードの場合、ファイルをバックアップする必要はありません。

おすすめ記事