私はunixに非常に慣れていません。次のコマンドを実行しました。
ls -l | xargs rm -rf bark.*
上記のコマンドは、フォルダー内のすべてのディレクトリを削除しました。
誰でも理由を説明できますか?
引数は、-r
「再帰的に削除する」(つまり、サブディレクトリに降りる) ことを意味します。この-f
コマンドは「強制」を意味します (つまり、確認を求めないでください)。-rf
「確認を求めずに再帰的にサブディレクトリに降りる」ことを意味します
ls -l
ディレクトリ内のすべてのファイルを一覧表示します。xargs
から入力ls -l
を取得し、渡すコマンドに追加しますxargs
実行された最終的なコマンドは次のようになります。
rm -rf bark.* <output of ls -l>
これにより、現在のディレクトリ内のすべてのファイルが基本的に削除bark.*
されました。話の教訓:非常に注意してrm -rf
ください。(rm -ri
代わりに、ファイルを削除する前に尋ねるために使用できます)
rm(1)
あなたが要求したため、現在の作業ディレクトリ内のすべてのファイルとディレクトリを削除しました。
何が起こったかを大まかに確認するには、次を実行します。
cd /etc ; ls -l | xargs echo
出力には細心の注意を払ってください。
コマンド ラインを作成するときecho
は、代わりにを使用することを強くお勧めします。rm -rf
出力に問題がないように見える場合にのみ、コマンドを で再実行してrm -rf
ください。迷ったときは、rm -r
吹き飛ばしすぎないように使ってみてはいかがでしょうか。コマンドラインに非常に懐疑的であるrm -ir
場合。(私は 1994 年から Linux を使用していますが、ファイルの山を選択的に削除するために少し複雑なコマンド ラインを作成するときに、このトリックを今でも使用しています。)echo
ちなみに、ls(1)
出力を解析することは避けたいと思います。ファイル名にはASCIIとchar 以外の任意の文字を含めることができます。改行、タブ、および出力のように見える出力も含まれます。などのツールでこれを解析しようとすると、危険な場合があります。NUL
/
ls -l
xargs(1)
代わりに、find(1)
これらの種類のものに使用してください。という名前のすべてのディレクトリ内のすべてのファイルを削除するbark.*
には、次のようなコマンドを実行します。
find . -type d -name 'bark.*' -print0 | xargs -0 rm -r
繰り返しますが、最初の実行echo
では代わりにrm -r
を使用します。問題がなければ、 で再実行しrm -r
ます。
このls -l
コマンドは、現在の現在の作業ディレクトリ (PWD) 内のすべてのサブディレクトリの一覧を表示します。
rm
複数のファイル/ディレクトリをリストとして渡すと、コマンドは複数のファイル/ディレクトリを削除できます。
例: 次rm test1.txt test2.txt myApp
の名前の 3 つのファイルすべてを削除します。
test1.txt
test2.txt
myApp
また、使用したコマンドのフラグはrm
、多くの愚行に共通しています。
rm -f
- 尋ねたり確認したりせずにファイルを強制的に削除する
rm -r
- すべてのサブディレクトリに再帰し、その内容とサブディレクトリをすべて削除する
たとえば、/home/user にいるとします。ディレクトリ構造は次のようになります。
/home/user
|->dir1
|->dir2
`->file1.txt
ls -l
コマンドは を含むリストを提供し、コマンド"dir1 dir2 file1.txt"
の結果は次のls -l | xargs rm -rf
ようになります。
rm -rf dir1 dir2 file1.txt
上記の例で元の質問を拡張すると、システムに渡される最終的なコマンドは次のようになります。
rm -rf di1 dir2 file1.txt bark.*
したがって、現在のディレクトリ内のすべてが消去されるため、bark.*
は冗長です (現在のディレクトリ内のすべてを破棄するようにマシンに効果的に指示しました)。
あなたが意図したことは、現在のディレクトリ内のすべてのファイルと、で始まるすべてのサブディレクトリ (再帰) を削除することだったと思いbark.
ます。
find -iname bark.* | xargs rm
上記のコマンドは、「このディレクトリとサブディレクトリ内で、大文字/小文字/mIxEdCaSe を無視して、"bark." で始まるすべてのファイルを検索し、それらを削除する」ことを意味します。タイプミスがあると、これはまだ悪いコマンドである可能性があるため、このような一括削除を行う前に必ずテストする必要があります。
今後は、最初に次の手順を実行して、最初に削除するすべてのファイルのリストを取得し、それらが削除したいファイルであることを確認します.
find -iname bark.* | xargs echo
次に、確信がある場合は、それらを削除します
find -iname bark.* | xargs rm
お役に立てれば。
ユーモラスなメモとして、「rm -rf」の最も有名な例の 1 つがここにあります :
自動化されたスクリプトは のようなものを実行しますがrm -rf /usr/local/.........
、誤ってスペースを挿入したため、コマンドが になりましたrm -rf /usr /local/......
。つまり、これは事実上、「usr または local で始まるすべてのルート フォルダーを削除する」ことを意味し、それを使用する人のシステムを効果的に破壊します。私はその開発者に同情します。
これらの種類のバグは、文字列を引用符で囲むことで回避できます。つまり
rm -rf "/usr/ local/...."
、エラー メッセージが表示され、このバグを回避できます。引用符は、それらの間のすべてが完全なパスであり、個別のパス/ファイルのリストではないことを意味するためです (つまり、ファイル/フォルダーの名前にスペース文字が含まれていることを rm に伝えています)。