Rubyと筋肉とギターとわたし

エンジニア二年目の雑魚です。プログラミング・ギター・筋トレのことをメインにブログを書いていきます。

【Linux】xargsに渡したファイルに空白がある場合の削除方法

どうもてぃです。

ちょっとだけハマったのでメモ。

ls, grep, xargs rm

上記のコマンドを組み合わせて、いつもどおり溜まったスクリーンショット画像を削除しようとしました。

すると。。。

$ ls | grep 'Screenshot' |  xargs rm
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-05-08' を削除できません: そのようなファイルやディレクトリはありません
rm: '16-39-46.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-14' を削除できません: そのようなファイルやディレクトリはありません
rm: '18-18-42.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-04-18' を削除できません: そのようなファイルやディレクトリはありません
rm: '10-37-00.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-12' を削除できません: そのようなファイルやディレクトリはありません
rm: '22-42-45.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-07' を削除できません: そのようなファイルやディレクトリはありません
rm: '18-41-14.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-04-16' を削除できません: そのようなファイルやディレクトリはありません
rm: '20-19-58.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-05-06' を削除できません: そのようなファイルやディレクトリはありません
rm: '18-28-44.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-01' を削除できません: そのようなファイルやディレクトリはありません
rm: '17-38-51.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-12' を削除できません: そのようなファイルやディレクトリはありません
rm: '17-43-33.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-06' を削除できません: そのようなファイルやディレクトリはありません
rm: '10-59-12.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-03-26' を削除できません: そのようなファイルやディレクトリはありません
rm: '10-35-37.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-04-28' を削除できません: そのようなファイルやディレクトリはありません
rm: '16-34-29.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-04-04' を削除できません: そのようなファイルやディレクトリはありません
rm: '11-03-00.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-02-08' を削除できません: そのようなファイルやディレクトリはありません
rm: '15-21-58.png' を削除できません: そのようなファイルやディレクトリはありません
rm: './Screenshot' を削除できません: そのようなファイルやディレクトリはありません
rm: 'from' を削除できません: そのようなファイルやディレクトリはありません
rm: '2019-01-25' を削除できません: そのようなファイルやディレクトリはありません
rm: '14-15-28.png' を削除できません: そのようなファイルやディレクトリはありません

ん???!!!??!?!?

前やった時こんなのでたっけ?状態になりました。

他にも、 find . -name 'Screenshot*' | xargs rmfind . -type f -name '*[Screenshot]*' | xargs rm 等も試してみましたが、ダメ。

結論

xargsコマンドは区切り文字に空白を使っているらしい。

つまり、空白の入ってるファイル名は別々のものと認識され、xargsに渡されてrmが実行されてしまうと。

そのため、区切りを空白文字ではなくnull文字で認識されなければいけないようです。

$ find . -name 'Screenshot*' -print0 | xargs -0 rm

xargsの -0 オプションの形式に合わせて、findコマンドで -print0 を指定してあげる。

これで解決しました。