アプリ版:「スタンプのみでお礼する」機能のリリースについて

今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/
としてみたのですが全然うまくいきませんでした。
どのようにしたらうまくいくでしょうか?

A 回答 (4件)

basename(1).

    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/14 19:57

%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)の末尾が/ならそれを取り除いてセットしています。

>としてみたのですが全然うまくいきませんでした。
「こういう結果を期待して、こういう操作を行ったが、こういう結果であった」と書くと他人にも伝わります。

この回答への補足

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

a b c d e.2005・・・
となってしまうので最後のファイルしかファイル名が変更されなくなってしまうということです。

補足日時:2005/07/14 16:00
    • good
    • 0
この回答へのお礼

どうもありがとうございます。
何でも聞いてばかりで申し訳ないのですが
このままだと引数として
../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.・・・・・・
というふうにできないでしょうか、ということです。

お礼日時:2005/07/14 16:54

とりあえず, date の引数の 20%y はなんかはずかしいので %Y にした方がよいかと.


あとは, 複数の引数が与えられたらどうするか, 引数にディレクトリが付いていたらどうするかによります.
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/07/14 16:22

こんばんは。

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コマンドでスラッシュを取り除いてみるとうまくいくようです。ただ、私も十分シェルスクリプトに習熟している訳ではないので、もっと良い方法はあると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
スラッシュだけをそのまま削除すると
./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/\///'`
というようにしましたが問題ないでしょうか?

お礼日時:2005/07/14 16:19

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!