• ベストアンサー

FreeBSDでファイルをゴミ箱に一旦捨てるスクリプト

今FreeBSDでファイルを削除する際にそのまま消すのではなく一旦 ~/.trash/ というディレクトリに移動させるスクリプトを作っています。 しかし私はスクリプトを作ったことがほとんどないためなかなあうまくいきません。 本を見て #! /bin/sh mv $@ ~/.trash/ という単純なものはできたのですが これだとディレクトリを削除してゴミ箱に送った後同じ名前のファイルを ゴミ箱に送ろうとするとエラーが起きてしまいます。 そこでゴミ箱に送る際ファイル名を 削除するファイル.現在の時刻  にしようと思い #! /bin/sh # move to the trash directory TRASHTIME=`date +"20%y-%m%d-%k%M%S"` mv $@ $@.$TRASHTIME mv $@.$TRASHTIME ~/.trash/ としてみたのですが全然うまくいきませんでした。 どのようにしたらうまくいくでしょうか?

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

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

basename(1).

fbsd5453
質問者

お礼

まさにやろうとしていたことそのままでした。 本当にありがとうございます

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10359)
回答No.3

%k より %H のほうが後で見やすいと思いますよ。 #!/bin/sh TRASHTIME=`date +%Y-%m%d-%H%M%S` for f do file=`expr "$f" : '\(.*\)/$' \| "$f"` mv $file ~/.trash/$file.$TRASHTIME done でどうでしょうか。 file=の行は、各引数($f)の末尾が/ならそれを取り除いてセットしています。 >としてみたのですが全然うまくいきませんでした。 「こういう結果を期待して、こういう操作を行ったが、こういう結果であった」と書くと他人にも伝わります。

fbsd5453
質問者

お礼

どうもありがとうございます。 何でも聞いてばかりで申し訳ないのですが このままだと引数として ../a/a/ff/f/as/r/d/fg/gomi と指定すると ~/.trash/../a/a/ff/f/as/r/d/fg/gomi.・・・・・ というファイルが作成されてしまいます。 なので一番最後のスラッシュを削除し、 それ以外のスラッシュの中で一番末尾に近いスラッシュより左を削除してしまうようにはできないでしょうか? つまり ../a/f/r/d/abcd/efgh/gomi/ が gomi.・・・・・・ というふうにできないでしょうか、ということです。

fbsd5453
質問者

補足

全然うまくいかなかったというのは 複数のファイルを削除しようと思ったときに不具合が起きたということです。 例えば a b c d e の五つのファイルを削除しようと思ったときに $@.$TRASHTIME が a b c d e.2005・・・ となってしまうので最後のファイルしかファイル名が変更されなくなってしまうということです。

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

とりあえず, date の引数の 20%y はなんかはずかしいので %Y にした方がよいかと. あとは, 複数の引数が与えられたらどうするか, 引数にディレクトリが付いていたらどうするかによります.

fbsd5453
質問者

お礼

20%y は %Y にすればよかったのですね。 ありがとうございました。

  • mech32
  • ベストアンサー率57% (23/40)
回答No.1

こんばんは。fbsd5453さんが作成されたスクリプトを拝見したところ、引数に例えば ./test/ というディレクトリ名を指定した場合に、$@によって、返される文字列が test/ になってしまうために、mvコマンドが、 mv test test/.2005-0713-214150 のように与えられてしまうようです。このtestの後のスラッシュを削除しないと、自分自身を自分自身の中に移す、ということになってしまってエラーになります。そこで、例えば #! /bin/sh # move to the trash directory TRASHTIME=`date +"20%y-%m%d-%k%M%S"` mv $@ ~/.trash/`echo $@.$TRASHTIME | sed 's/\///'` のように、sedコマンドでスラッシュを取り除いてみるとうまくいくようです。ただ、私も十分シェルスクリプトに習熟している訳ではないので、もっと良い方法はあると思います。

fbsd5453
質問者

お礼

ありがとうございます。 スラッシュだけをそのまま削除すると ./a とか ../a とか指定すると . が残ってしまうので #! /bin/sh # move to the trash directory TRASHTIME=`date +"20%y-%m%d-%k%M%S"` mv $@ ~/.trash/`echo $@.$TRASHTIME | sed 's/\.\.\///' | sed 's/\.\///' | sed 's/\///'` というようにしましたが問題ないでしょうか?

関連するQ&A

専門家に質問してみよう