• ベストアンサー

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です

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.7

シェルに依存の少ない、昔からの常套手段なら、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" ` を試してみればわかります

okonekat
質問者

お礼

とても勉強になりましたどうもありがとうございます><

その他の回答 (7)

回答No.8

zshということなので、普通にバックスラッシュでスペースをエスケープすれば良いですよ。  rm **/*\ *.txt(.) 最後の (.) は通常ファイルを対象にファイル名展開させる指定です。 あと、他の回答者の方が言われているようにfindだけでもできますよ。zshを入れられる環境であれば、GNUツールも利用できるでしょうから、GNU findを使って、  find -type f -name '* *.txt' -delete POSIXでは  find . -type f -name '* *.txt' -exec rm '{}' + とか。+ を使うと引数をまとめてコマンドに渡してくれるのでプロセス数が少なく済みます。

okonekat
質問者

お礼

(.)って書き方初めて知りましたどうもありがとうございます><

noname#178001
noname#178001
回答No.6

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 {} \; ですね。

okonekat
質問者

お礼

コマンドの部分もタブで展開できるんですね!勉強になりましたありがとうございます><

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

もう一発. システムによっては「find だけ」でできるらしいよ.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ちょっと端折りすぎたので補足. find 使うなら, バッククォートでなんとかするよりも -exec なり xargs なりを使った方が安全でしょう.

okonekat
質問者

お礼

スマートなやり方教えてくれてありがとうございます><

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

-exec 使えば?

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

変数aaaを使うにしても rm "${aaa}" で大丈夫なはずですが。 これだと、そのエラーメッセージにあるように、"はただの文字として使われます。

okonekat
質問者

補足

rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` 始めの問題は、txtファイルをまとめて削除しようとして上のようにするとファイル名にスペースが含まれていた場合に削除されない問題でした。 スペースが入っていても動作するようにするにはどうすれば良いのか知りたかったのでこのような質問をしてしまいました。 "をただの文字として扱われないようにすることとかってできませんか?><

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

ふつ~に rm "test space.txt" とすればいいだけのはずなのに, なんでそんなめんどくさい方法をとらにゃならんのでしょうか. まあ, くくり方が甘いんだろうけどねぇ.

okonekat
質問者

補足

rm `find . -name "*.txt" | awk 'BEGIN{ORS=" "}{print $0}'` 始めの問題は、txtファイルをまとめて削除しようとして上のようにするとファイル名にスペースが含まれていた場合に削除されない問題でした。 スペースが入っていても動作するようにするにはどうすれば良いのか知りたかったのでこのような質問をしてしまいました。 「くくり方が甘い」というのはどういうことですか?具体的に教えてください><

関連するQ&A