名前にスペースが含まれているファイルを削除する


10

名前にスペースが含まれているすべてのファイルを削除しようとしています。次のコマンドを使用しています。しかし、それは私にエラーを与えています

コマンド: ls | egrep '. ' | xargs rm

ls | egrep '. 'コマンドのみを使用している場合、ファイル名にスペースを含むすべてのファイル名が表示されます。しかし、出力をrmに渡そうとすると、すべてのスペース(先頭または末尾)が削除されます。だから私のコマンドは正しく実行されていません。

名前に少なくとも1つのスペースがあるファイルを削除する方法についてのポインタはありますか?

回答:


29

rmコマンドで標準のグロビングを使用できます。

rm -- *\ *

これにより、名前にスペースが含まれるファイルが削除されます。スペースはエスケープされるため、シェルはそれを区切り文字として解釈しません。追加する--と、ダッシュで始まるファイル名の問題が回避されます(それらはによって引数として解釈されませんrm)。

削除する前に各ファイルを確認する場合は、-iオプションを追加します。

rm -i -- *\ *

4
あなたは間違いなくecho最初からこれを実行して、タイプミスを防ぐ必要があります。echo先頭に追加すると、削除するすべてのファイルが印刷されます。
2015年

1
アヌジ、これが最も賛成票を獲得する理由findは、強力ではあるが、マシンガンでチキンを殺す必要がない場合があるためです。UNIX管理者は一般findに(たとえば)「文字Aで始まるすべてのファイルを削除する」手段をとらないでしょう...単にrm A*。同様に、スペースを含むファイルを削除するために、rmはジョブを実行できます。つまり、スペースは見えず、シェルによって特別に扱われるため、だまされないでください。Stephen Kittが行ったように、単にそれをエスケープし、他のキャラクターと同じように考えることができます。
マイクS

14

ls出力の解析は避けます

何故なの :

find . -type f -name '* *' -delete

rm:-)では問題ありません。

これは再帰的であり、コメントで言及されているように、現在のディレクトリとネストされたディレクトリにスペースがあるすべてのファイルを削除します。


4
(1)-name '* *'正規表現の代わりに使用できます。(2)-print0 | xargs -0 rm -i@StephenKittの懸念に対処するために使用できます。
Kevin

1
必要はありませんxargs。ただ使用してください-exec rm -i '{}' +
R .. GitHub ICE HELPING ICEを停止します

1
@Mhmd 8ビットのゲームコンソールよりも多くの落とし穴があります。mywiki.wooledge.org/ParsingLs
Daenyth

1
サブディレクトリを避けたい場合は、を使用してくださいfind . -maxdepth 1 -name '* *' -delete
Mikkel

1
@BenjaminW。修繕 ?
solsTiCe 2018年

6

このSuppose名「奇妙なファイル」を見てください。

ソリューション1

rm strange\ file

ソリューション2

rm "strange file"

ソリューション3

ls -i "strange file"

次に、iノードが表示されます

find . -inum "numberoofinode" -exec rm {} \;

次のような非常に奇妙なファイル名の場合

!-filename or --filename

使用する

rm ./'!-filename'

4

から 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



-1

そのようにするには-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ます。
ステファンChazelas

1
@Kusalananda直したと思います。
ctrl-alt-delor 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.