準・究極の選択

ターミナルコマンドで、いろいろ試したのですが上手くいきません。ご教授お願いします。

フォルダ内に、001.rtf~004.rtf のファイルがあります。
さらに、このフォルダ内には、01 5.rtf、01 6.rtf、01 7.rtf ・・・というファイル名が、01 15.rtf まであります※01の後に半角スペースが入ってます➡01<半角スペース>5.rtf

この、01 5.rtfから始まるファイルを、005.rtf~015.rtf としたいのです。
ターミナルコマンド解説サイトなどを拝見しながら試しているのですが、上手くいきません。
以下は私が、実施したコマンドです。どの辺が間違っていますでしょうか??

for F in "01 [5-15].rtf"; do mv $F ${F/"01 "/00};done

do以降の、{F/"01 "/00} の辺りが間違っているかな??と思うのですが、どうして良いか分からず・・・
そもそも、上記コマンド自体が間違っているとか?!

よろしくお願いします。

A 回答 (4件)

>あの、“>”はなんなのでしょうか??



コマンドが完結していない場合に出ます。
例えばforループの途中までしか入力していない場合です。
for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;
で改行すると、表示されます。その時に残りのdoneを入れると完結しますので動き出します。

>長いコマンドを入力(ペースト)した際に、1行で表示されてしまうことが多々あります。
普段はMacのターミナルでLinuxに接続して使う場合が多いのですが、そんなことが過去にあったように思います。
カーソルを動かして編集をしない限り問題なかったように思いますので、実害はないのでそういうこともあるのかと気にしていませんでした。何もしなくても回復したので原因は特定できていませんが、最近はお目にかかったことはありません。
多発するようであれば、ターミナル関係の設定ファイルを消してしまうのも手かも知れません。
~/Library/Preferences/

com.apple.Terminal.plist
があります。
    • good
    • 0
この回答へのお礼

ようやく、出来るようになりました!!
ターミナルはやはりおかしかった様です・・・ご指摘にあった、“com.apple.Terminal.plist”を削除して、安定して動作するようになりました。

今回は、最後までお付き合いいただき、感謝してます。
ターミナルは今後も勉強していきたいと思います。
本当にありがとうございました!!

お礼日時:2013/07/04 20:23

No.2のスクリプトに間違いがありました。

幸いエラーがでるだけですが、場合によってはファイルを消してしまったりする場合もありますので、コマンドが正しいか確認後実行するようにするために、|shを付けるようにしています。
ls|ruby -n -e 'f=$_.chomp; puts %[mv -n "#{f}" #{f.gsub(/ /,"")}] if f[/ /]'
が正解です。
mvは名前が上書きしてしましますので、-nか-iを付けるのがよいようです。
    • good
    • 0
この回答へのお礼

細かいご指示ありがとうございます。とても助かります。
今後使ってみたいと思います。

お礼日時:2013/07/04 00:13

shellスクリプトを使おうとするので、結構経験者かと思っていました。


特に何も設定していなければbashが起動しますので、起動した状態のままでbashが起動した状態です。

こちらでも試してみましたが、正常に動きますよ。
動かす前にcdで変更したいファイルが入っているフォルダに移動していますか?
Finderでそのフォルダを表示させ、ターミナルに
cd(スペース)と打ち込んで、その後でFinderに表示されているフォルダのアイコンをターミナル画面にドラッグします。
表示は
cd /Users/xxxx/xxx/xx
のような感じになるはずです。
ls
で変更したいファイルが表示されることを確認後実行してみてください。

shellスクリプトのループなどは結構敷居が高いので、どうしてもshellスクリプトでないといけない場合以外お勧めしません。

標準でRubyやPerlなどが入っていますので、そちらでやる方がずっと簡単です。
Rubyでの例ですが
ls|ruby -n -e 'f=$_.chomp; puts %[mv "#{f}" #{f.strip}] if f[/ /]'
でファイル名に空白が入っている場合に、空白の無いファイル名にするというものです。
上のスクリプトは表示だけですので、同じく後ろに|shを付ければコマンドが実行されます。
強引に一行に押し込んだのでちょっとみにくいスクリプトになっていますが。

この回答への補足

度々のご回答ありがとうございます。ki073さんの言う通り、No.1の for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;done|sh を実行して結果を出す事が出来ました!ありがとうございます。
ただ・・・結果が出たのですが、どうも当方のターミナルの挙動がおかしいです。というのは、上のコマンドを実行(上記コマンド入力後、returnキーを押下)しても、“>”の表示がされ、何も起きない時があるのです。しかし、結果が出る時もあります。
No.1の回答を頂いた時は、上記状態になり、なかなか結果がでませんでした。
あの、“>”はなんなのでしょうか??
表示としては、以下のイメージです。

xxx$ for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;done|sh
>

この表示なると、結果が出ません。
結果が出る出ないの操作上の違いはありません。コピーペーストで、実行しているので間違いなく同じコマンドです。
また、当初からcd にて、ターゲットのフォルダに移動してあり、ls にてフォルダ内のファイルも問題なく表示されます。

因に、ターミナルのウインドウサイズが初期のままの状態で使用していると、長いコマンドを入力(ペースト)した際に、1行で表示されてしまうことが多々あります。その状態で、ウインドウサイズを変更すると、文字がバラバラに散らばってしまいます。これは、もうバグですよね??

私の環境のターミナルが何かおかしいのでしょうか??
因にOSは10.8.4です。

補足日時:2013/07/04 00:11
    • good
    • 0

bashだとして書きます。


単純にFを出力するスクリプトに変えてみますと
for F in "01 [5-15].rtf"; do echo $F;done
出力は
01 [5-15].rtf
となるだけですので、forが回っていません。

まずコマンドを実行するのではなくechoで出力するだけにします。
for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;done
これで期待するmv命令が出力されるはずです。

後ろに|shをつけて
for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;done|sh
を実行すると期待した動作をするはずです。

この回答への補足

ご回答ありがとうございます。
bash・・・ですか。
色々とサイトを見ていまして、お返事に時間がかかりました。
率直な感想、私には敷居が高そうです。

ターミナルの環境設定から、設定➡シェルにて、bashにて起動 ですよね?
その後、ki073さんの通りに実行していったのですが、結果としてファイル名は変更できませんでした。

for F in $(seq 5 15); do echo "mv '01 $F.rtf' 01$F.rtf" ;done|sh
を実行すると、
>
となり、ここから更に何かを実行しなくてはいけないという事でしょうか??

すいません。Mac歴は7年程経つのですが、恥ずかしながらターミナルは完全な初心者で、2~3日前からサイトみるなりしていまして・・・

補足日時:2013/06/30 23:41
    • good
    • 0

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


おすすめ情報