web-dev-qa-db-ja.com

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

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

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

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

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

10
Anuj

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

rm -- *\ *

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

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

rm -i -- *\ *
29
Stephen Kitt

ls出力の解析は避けます

何故なの :

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

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

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

14
solsTiCe

この「名前の奇妙なファイル」という名前を見てください

解決策1

rm strange\ file

ソリューション2

rm "strange file"

ソリューション3

ls -i "strange file"

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

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

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

!-filename or --filename

使用する

rm ./'!-filename'
6
elbarna

man xargsから

xargsは、標準入力、空白で区切られた(二重引用符、単一引用符、またはバックスラッシュで保護できます)または改行から項目を読み取り、コマンド(デフォルトは/ bin/echo)を1つ以上実行します最初の引数の後に標準入力から読み取られた項目が続く時間。標準入力の空白行は無視されます。

Xargs区切り文字を改行に変更することで、(ほとんど)初期コマンドを修正できます。

ls | egrep '. ' | xargs -d '\n' rm(これを行わないでください...読んでください)

しかし、ファイル名に改行が含まれている場合はどうなりますか?

touch "filename with blanks and newline"

NIXファイル名には空白と改行を含めることができるであるため、このデフォルトの動作には問題があることがよくあります。空白や改行を含むファイル名は、xargsによって誤って処理されます。これらの状況では、このような問題を防ぐ-0オプションを使用することをお勧めします。

ls実際には人間が直接使用するためのツール 、代わりにfindコマンドを使用して、ファイル名をヌル文字(-print0)。また、入力(-z)と出力(-Z)を分離するためにnull文字を使用するようにgrepに指示する必要があります。最後に、xargsにnull文字も使用するように指示します(-0

find . -type f -print0 | egrep '. ' -z -Z | xargs -0 rm

4
anjsimmo

以下を使用できます。

find . -name '* *' -delete
1
Max ZHUANG