回答:
rm
コマンドで標準のグロビングを使用できます。
rm -- *\ *
これにより、名前にスペースが含まれるファイルが削除されます。スペースはエスケープされるため、シェルはそれを区切り文字として解釈しません。追加する--
と、ダッシュで始まるファイル名の問題が回避されます(それらはによって引数として解釈されませんrm
)。
削除する前に各ファイルを確認する場合は、-i
オプションを追加します。
rm -i -- *\ *
find
は、強力ではあるが、マシンガンでチキンを殺す必要がない場合があるためです。UNIX管理者は一般find
に(たとえば)「文字Aで始まるすべてのファイルを削除する」手段をとらないでしょう...単にrm A*
。同様に、スペースを含むファイルを削除するために、rmはジョブを実行できます。つまり、スペースは見えず、シェルによって特別に扱われるため、だまされないでください。Stephen Kittが行ったように、単にそれをエスケープし、他のキャラクターと同じように考えることができます。
ls
出力の解析は避けます
何故なの :
find . -type f -name '* *' -delete
rm
:-)では問題ありません。
これは再帰的であり、コメントで言及されているように、現在のディレクトリとネストされたディレクトリにスペースがあるすべてのファイルを削除します。
-name '* *'
正規表現の代わりに使用できます。(2)-print0 | xargs -0 rm -i
@StephenKittの懸念に対処するために使用できます。
xargs
。ただ使用してください-exec rm -i '{}' +
find . -maxdepth 1 -name '* *' -delete
。
から man xargs
xargsは標準入力から項目を読み取り、ブランク(二重引用符または単一引用符またはバックスラッシュで保護できます)または改行で区切られ、コマンド(デフォルトは/ bin / echo)を1回以上実行し、その後に初期引数を続けます標準入力から読み取られたアイテム。標準入力の空白行は無視されます。
xargs区切り文字を改行に変更することで、(ほとんど)初期コマンドを修正できます。
ls | egrep '. ' | xargs -d '\n' rm
(これを行わないでください...読んでください)
しかし、ファイル名に改行が含まれている場合はどうなりますか?
touch "filename with blanks
and newline"
Unixファイル名には空白や改行を含めることができるため、このデフォルトの動作には問題があることがよくあります。空白や改行を含むファイル名は、xargsによって誤って処理されます。このような状況では、このような問題を防ぐ-0オプションを使用することをお勧めします。
ls
は実際には人間が直接使用するためのツールです。代わりにfind
、ファイル名をnull文字(-print0
)で区切ることができるコマンドを使用する必要があります。また、入力(-z
)と出力(-Z
)を区切るためにnull文字を使用するようにgrepに指示する必要があります。最後に、xargsにnull文字(-0
)も使用するように指示します
find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm
以下を使用できます。
find . -name '* *' -delete
そのようにするには-Z
、grepの-0
オプションとxargs のオプションが必要です。しかし、私はそのようにls
はしません(仕事に適したツールではありません。コンピューターに出力を読み取らせるには多くの問題があります)。
より良い方法については、他の回答を参照してください。
また
ls | …
ls -d *
およびと同等echo * | …
すべて問題があります。したがってls
、このように使用しないでください。別の回答の解決策を使用してください。
ls *
、パイプがファイル名を改行で区切って出力する場合。echo
(少なくとも一部のecho
実装)は、バックスラッシュシーケンスを展開します。grep -Z
を使用するときにNUL区切りのファイル名を書き込む-l
ためのものであり、ここでは役に立ちません。を意味している場合-z
、ほとんどのls
実装にはNUL区切りのファイル名を出力するオプションがないため、これも役に立ちません。でもそのようなことをすることができprintf '%s\0' * | grep -z ' ' | xargs -r0 rm -f
ます。
echo
最初からこれを実行して、タイプミスを防ぐ必要があります。echo
先頭に追加すると、削除するすべてのファイルが印刷されます。