質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

4回答

632閲覧

以下の画像のようなディレクトリを一気に置き換えるコマンドはどのようなものですか?

tedmosby

総合スコア46

terminal

Terminalは、Apple社のmacOSに標準で付属しているUNIX端末エミュレータ。UNIXコマンドによってMacの操作および設定を行うことができます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

1クリップ

投稿2021/01/05 01:53

以下のディレクトリをそれぞれ、sec1, sec2, ...(略)..., sec10と置き換えたいのですが、どのようなコマンドを書けばよいでしょうか?

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

まず実行されるコマンドを確認してから(このコマンドではまだmvは実行されません)

$ find . -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#'

後ろに「|sh」をつけて実際に実行してください

$ find . -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#' | sh

実行結果

terminal

1$ mkdir {1,2,3,4,5,6,7,8,9,10}章 2$ ls -F 310章/ 1章/ 2章/ 3章/ 4章/ 5章/ 6章/ 7章/ 8章/ 9章/ 4$ find . -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#' 5mv ./4章 ./sec4 6mv ./6章 ./sec6 7mv ./10章 ./sec10 8mv ./8章 ./sec8 9mv ./7章 ./sec7 10mv ./2章 ./sec2 11mv ./9章 ./sec9 12mv ./1章 ./sec1 13mv ./3章 ./sec3 14mv ./5章 ./sec5 15$ find . -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#' | sh 16$ ls -F 17sec1/ sec10/ sec2/ sec3/ sec4/ sec5/ sec6/ sec7/ sec8/ sec9/

#追記

他の方の回答のコメントを見て思ったのですが、章番号が単純な連番であることがわかっているのなら

seq 10 | xargs -I@ echo mv @章 sec@ | sh

あたりでも十分に目的を達成できる気がしてきました。

#コメントでのご指摘を受けて補足

質問にあるディレクトリ構造の範囲であれば不具合は表面化しない部分なのですが、dodaさんがコメントで指摘されている通り下の階層に渡って「章」ディレクトリが複数ある場合にmvに失敗します。
それを防ぐようにする場合には次のようにfindにオプションをつけてください

$ find . -maxdepth 1 -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#' | sh
$ find . -depth -name *章 | xargs -I@ echo mv @ @ | sed 's#([^/]*)章$#sec\1#' | sh

投稿2021/01/05 03:01

編集2021/01/05 09:09
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

doda

2021/01/05 05:47

findではディレクトリの中も再帰的に検索するので、./1章/3章 のようなディレクトリが有った場合にこれも対象になってしまいます。なので -maxdepth 1 を指定して探索する深さを限定する方が安全でしょう。 逆に ./1章/3章 も対象にしたい場合は -maxdepth は必要有りませんが、./1章/3章 より先に ./1章 の方がリネームされるので ./1章/3章 の方がエラーになります。 なのて ./1章/3章 を先にリネームさせる為に -depth を指定して深い方優先で探索させる必要が有ります。
hidezzz

2021/01/05 08:34

ご指摘ありがとうございます。 そのとおりですね。 findとmvを組み合わせる際には注意すべき点でした。 あとで回答に補足したいと思います。
guest

0

投稿2021/01/05 02:05

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2021/01/05 03:40

10個くらいであれば、mvでリネームした方が早いと思いましたので +1
y_waiwai

2021/01/05 04:15

ワイルドカードで一気に、というきがしたんで反射的に回答したけど、 そこから考えるのが。。w
hidezzz

2021/01/05 04:21

確かに自分の回答は複雑すぎるなあと感じていたので、もうちょっと単純な方法を追記しました。 ありがとうございました。
guest

0

既にベストアンサーが付いているので目的は達しているとは思いますが別解を。

zsh付属のzmvを利用

zshを使っているのならばzmvが便利です。

autoload -U zmv を実行するとzmvが使えるようになります。
zmvで一括リネームするには以下を実行します。

zsh

1zmv -W '*章' 'sec*'

あらかじめalias zmv='noglob zmv'を実行しておくと、zmv -W *章 sec* のように、クオート無しでコマンドが実行できるようになります。

zmvを頻繁に使うようならば、以下を.zshrcに追加しておくといいでしょう。

zsh

1autoload -U zmv 2alias zmv='noglob zmv'

forによる繰り返し処理

こちらはzshだけではなくbash等でも使えます。
以下のコマンドでリネームが出来ます。

for dir in *章; do mv $dir sec${dir%章}; done

for dir in *章*章の展開結果を一つずつ変数dirにいれで、doからdoneの間のコマンドを繰り返し実行します。

${dir%章}は、変数dirを展開する時に末尾のを削ります。
逆にsec1secの部分を削りたい場合は${dir#sec}のようにします。

慣れるまではhidezzzさんがやられているように、mvecho mvにして実行するコマンドを表示させて確認し、問題が無いようならば| shを追加するのが安全でしょう。

投稿2021/01/05 05:41

doda

総合スコア947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tedmosby

2021/01/05 05:49

ありがとうございます!
guest

0

sh

1 2ls *章 | perl -p -e 's/(.*?)(章$)/mv \1\2 cas\1/g' | sh 3

とか?

投稿2021/01/05 12:34

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問