
ディレクトリに次のファイルがあるとします。
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プログラム、シェルスクリプトなど...)などの「ソース」コードの場合、ファイルをバックアップする必要はありません。
答え2
*.*~
.
どのディレクトリにも拡張されず、現在のディレクトリにあり、次に終わるファイルまたはディレクトリのみが一致します。~
~
現在のディレクトリで終わるすべてのファイルを見つけるには、次のようfind
なものを使用します。
find -type f -name '*~' -delete