- ベストアンサー
zshで名前に半角スペースを含むファイルの削除
test space.txt という名前のファイルを削除したい時 aaa="test space.txt" rm $(echo ${aaa}|awk '{print "\""$0"\""}') とやってダブルクォートでくくっても、 rm: "test: No such file or directory rm: space.txt": No such file or directory となって、"test と space.txt" で分かれてしまいます。 どうすれば良いのでしょうか>< zshです
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
シェルに依存の少ない、昔からの常套手段なら、findの-execを使って find . -name "*.txt" -exec rm \{\} \; 最近の流行りはxargsを使って find . -name "*.txt" -print0 | xargs -0 rm zsh限定なら、再帰的にマッチする**を使って rm **/*.txt なんにせよ rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` のawkは無意味 「findの結果が行でパイプを通ってawkへ→awkで改行をスペースに変換」 って動作になるけど、バッククオート自体が改行→スペースになるので。 echo `find . -name "*.txt" ` を試してみればわかります
その他の回答 (7)
- MillenniuM
- ベストアンサー率58% (42/72)
zshということなので、普通にバックスラッシュでスペースをエスケープすれば良いですよ。 rm **/*\ *.txt(.) 最後の (.) は通常ファイルを対象にファイル名展開させる指定です。 あと、他の回答者の方が言われているようにfindだけでもできますよ。zshを入れられる環境であれば、GNUツールも利用できるでしょうから、GNU findを使って、 find -type f -name '* *.txt' -delete POSIXでは find . -type f -name '* *.txt' -exec rm '{}' + とか。+ を使うと引数をまとめてコマンドに渡してくれるのでプロセス数が少なく済みます。
お礼
(.)って書き方初めて知りましたどうもありがとうございます><
zsh なんだから、 rm *.txt と打ったら、tabキー押せばよい。 *.txt が適切に quote されて展開されます。 なんだったら rm `find . -name \*.txt` まで打って、tabキーを押せば、find の実行内容が 展開されます。 rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` と打った後。TABキーを押して展開してみて比較すれば何が悪いかわかるでしょう。 もともとのスクリプトは、 find → 1行1ファイル名(1行1レコード) awk → 1行複数レコードが前提の処理系 なので、組み合わせが間違っています。 あえて書くならば find . -name \*.txt -exec rm {} \; ですね。
お礼
コマンドの部分もタブで展開できるんですね!勉強になりましたありがとうございます><
- Tacosan
- ベストアンサー率23% (3656/15482)
もう一発. システムによっては「find だけ」でできるらしいよ.
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと端折りすぎたので補足. find 使うなら, バッククォートでなんとかするよりも -exec なり xargs なりを使った方が安全でしょう.
お礼
スマートなやり方教えてくれてありがとうございます><
- Tacosan
- ベストアンサー率23% (3656/15482)
-exec 使えば?
- kmee
- ベストアンサー率55% (1857/3366)
変数aaaを使うにしても rm "${aaa}" で大丈夫なはずですが。 これだと、そのエラーメッセージにあるように、"はただの文字として使われます。
補足
rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` 始めの問題は、txtファイルをまとめて削除しようとして上のようにするとファイル名にスペースが含まれていた場合に削除されない問題でした。 スペースが入っていても動作するようにするにはどうすれば良いのか知りたかったのでこのような質問をしてしまいました。 "をただの文字として扱われないようにすることとかってできませんか?><
- Tacosan
- ベストアンサー率23% (3656/15482)
ふつ~に rm "test space.txt" とすればいいだけのはずなのに, なんでそんなめんどくさい方法をとらにゃならんのでしょうか. まあ, くくり方が甘いんだろうけどねぇ.
補足
rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` 始めの問題は、txtファイルをまとめて削除しようとして上のようにするとファイル名にスペースが含まれていた場合に削除されない問題でした。 スペースが入っていても動作するようにするにはどうすれば良いのか知りたかったのでこのような質問をしてしまいました。 「くくり方が甘い」というのはどういうことですか?具体的に教えてください><
お礼
とても勉強になりましたどうもありがとうございます><