名前にスペースが含まれているすべてのファイルを削除しようとしています。次のコマンドを使用しています。しかし、それは私にエラーを与えています
コマンド:ls | egrep '. ' | xargs rm
ここで、ls | egrep '. '
コマンドのみを使用している場合、ファイル名にスペースを含むすべてのファイル名が表示されます。しかし、出力をrmに渡そうとすると、すべてのスペース(先頭または末尾)が削除されます。だから私のコマンドは正しく実行されていません。
名前に少なくとも1つのスペースがあるファイルを削除する方法についてのポインタはありますか?
rm
コマンドで標準のグロビングを使用できます。
rm -- *\ *
これにより、名前にスペースが含まれるファイルが削除されます。スペースはエスケープされるため、シェルはそれを区切り文字として解釈しません。 --
を追加すると、ダッシュで始まるファイル名の問題が回避されます(rm
によって引数として解釈されることはありません)。
削除する前に各ファイルを確認する場合は、-i
オプションを追加します。
rm -i -- *\ *
ls
出力の解析は避けます
何故なの :
find . -type f -name '* *' -delete
rm
では問題ありません:-)。
これは再帰的であり、コメントで言及されているように、現在のディレクトリとネストされたディレクトリにスペースがあるすべてのファイルを削除します。
この「名前の奇妙なファイル」という名前を見てください
解決策1
rm strange\ file
ソリューション2
rm "strange file"
ソリューション3
ls -i "strange file"
次に、iノードが表示されます
find . -inum "numberoofinode" -exec rm {} \;
次のような非常に奇妙なファイル名の場合
!-filename or --filename
使用する
rm ./'!-filename'
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
以下を使用できます。
find . -name '* *' -delete