🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

1321閲覧

シェルコマンドでフォルダより以下の階層全ての名前を変更したい

kazumasamatsumo

総合スコア41

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2019/10/30 03:20

今シェルを勉強中なのですがshを使ってフォルダより以下の階層の名前を全て変更したいと考えています。

~/test $ tree . ├── test-1 │   ├── test-1.1 │   │   ├── test-1.1.1 │   │   ├── test-1.1.2 │   │   └── test-1.1.3 │   ├── test-1.2 │   │   ├── test-1.2.1 │   │   ├── test-1.2.2 │   │   └── test-1.2.3 │   └── test-1.3 │   ├── test-1.3.1 │   ├── test-1.3.2 │   └── test-1.3.3 ├── test-2 └── test-3

こんな感じなんですけどtestの部分を全てhonbanに変更にできるシェルスクリプトを作りたいです。

調べたところ

https://www.d-wood.com/blog/2014/06/26_6412.html

こういう感じでlsで表示して一括変更を見たのですが、それ以下の階層は変更されていませんでした。

~/test $ tree . ├── honban-1 │   ├── test-1.1 │   │   ├── test-1.1.1 │   │   ├── test-1.1.2 │   │   └── test-1.1.3 │   ├── test-1.2 │   │   ├── test-1.2.1 │   │   ├── test-1.2.2 │   │   └── test-1.2.3 │   └── test-1.3 │   ├── test-1.3.1 │   ├── test-1.3.2 │   └── test-1.3.3 ├── honban-2 └── honban-3

こんな感じです。

このtestの部分を全てhonbanに変更したいのですが、何かいい記事もしくはいい方法などありましたら教えてもらえるとありがたいです。

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

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

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

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

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

yambejp

2019/10/30 03:23

> testの部分を全て ディレクトリ名もファイル名も全てですか? またtest-1とhonban-1が最初からあると競合しますが 絶対にない前提で大丈夫ですか?
kazumasamatsumo

2019/10/30 03:25

testの部分をhonbanに変更したいです。 ディレクトリ名もファイル名もです 絶対にない前提です。
kazumasamatsumo

2019/10/30 03:26

~/test $ tree . ├── test-1 │   ├── test-1.1 │   │   ├── test-1.1.1 │   │   ├── test-1.1.2 │   │   └── test-1.1.3 │   ├── test-1.2 │   │   ├── test-1.2.1 │   │   ├── test-1.2.2 │   │   └── test-1.2.3 │   └── test-1.3 │   ├── test-1.3.1 │   ├── test-1.3.2 │   └── test-1.3.3 ├── test-2 └── test-3 このファイル名ディレクトリ名のtestをhonbanに変更したい感じですね
guest

回答2

0

ベストアンサー

  • set.sh

sh

1#!/bin/sh 2 3rm -rf test*; 4rm -rf honban*; 5 6mkdir test-1; 7mkdir test-1/test-1.1; 8mkdir test-1/test-1.2; 9mkdir test-1/test-1.2.1; 10mkdir test-1/test-1.2.2; 11mkdir test-1/test-1.2.2.1; 12mkdir test-1/test-1.3; 13mkdir test-2; 14mkdir test-3; 15 16touch test-1/test-1.1/test-1.1.1.txt; 17touch test-1/test-1.1/test-1.1.2.txt; 18touch test-1/test-1.1/test-1.1.2.txt; 19touch test-1/test-1.1/test-1.1.3.txt; 20touch test-1/test-1.2/test-1.2.1.txt; 21touch test-1/test-1.2/test-1.2.2.txt; 22touch test-1/test-1.2/test-1.2.3.txt; 23touch test-1/test-1.3/test-1.3.1.txt; 24touch test-1/test-1.3/test-1.3.3.txt; 25touch test-3/test-3.txt;
  • change.sh

sh

1#!/bin/sh 2 3for i in `find . -name '*test*' | sort -r` 4do 5j=`echo $i|sed -E 's/(.*)test/\1honban/'`; 6#echo $i $j; 7mv $i $j; 8done;

test

sh

1sh set.sh; 2find . -name "*test*" | sort 3./test-1 4./test-1/test-1.1 5./test-1/test-1.1/test-1.1.1.txt 6./test-1/test-1.1/test-1.1.2.txt 7./test-1/test-1.1/test-1.1.3.txt 8./test-1/test-1.2 9./test-1/test-1.2.1 10./test-1/test-1.2.2 11./test-1/test-1.2.2.1 12./test-1/test-1.2/test-1.2.1.txt 13./test-1/test-1.2/test-1.2.2.txt 14./test-1/test-1.2/test-1.2.3.txt 15./test-1/test-1.3 16./test-1/test-1.3/test-1.3.1.txt 17./test-1/test-1.3/test-1.3.2.txt 18./test-1/test-1.3/test-1.3.3.txt 19./test-2 20./test-3 21./test-3/test-3.txt

sh

1sh change.sh; 2find . -name "*honban*" | sort 3./honban-1 4./honban-1/honban-1.1 5./honban-1/honban-1.1/honban-1.1.1.txt 6./honban-1/honban-1.1/honban-1.1.2.txt 7./honban-1/honban-1.1/honban-1.1.3.txt 8./honban-1/honban-1.2 9./honban-1/honban-1.2.1 10./honban-1/honban-1.2.2 11./honban-1/honban-1.2.2.1 12./honban-1/honban-1.2/honban-1.2.1.txt 13./honban-1/honban-1.2/honban-1.2.2.txt 14./honban-1/honban-1.2/honban-1.2.3.txt 15./honban-1/honban-1.3 16./honban-1/honban-1.3/honban-1.3.1.txt 17./honban-1/honban-1.3/honban-1.3.2.txt 18./honban-1/honban-1.3/honban-1.3.3.txt 19./honban-2 20./honban-3 21./honban-3/honban-3.txt 22

投稿2019/10/30 04:43

yambejp

総合スコア116694

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

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

yambejp

2019/10/30 04:44

ただしファイル名やディレクトリ名にtestが複数発生する場合など ただしく処理されません
kazumasamatsumo

2019/10/30 05:01

ありがとうございます!!できました!!
guest

0

※LinuxMint19.2(Ubuntu18.04LTS相当)で確認しています。
おそらく最近のLinux環境なら大丈夫だと思いますが、そうでない場合、使えないオプションがある等の理由で動作しないことがあるかもしれません。

次のコマンドで、ご希望の動作をするために実行するmvコマンドの羅列を出力することができます。
コマンドはtestディレクトリに移動してから実行してください。
次に進む前に、必ず表示されたmvコマンドが正しいものであることを確認してください。
確認せずに次に進んで実行するとディレクトリやファイルに対して意図しない変更をしてしまう危険性があります。

find . -depth | grep test | sed -e 's#(.*)(/[^/]*)#mv \1\2 \1\2#' -e 's#(.*)test([^/])#\1honban\2#'

確認できたら、前記コマンドラインの最後に「| sh」を追加して実行すると実際にコマンドが実行されます。

find . -depth | grep test | sed -e 's#(.*)(/[^/]*)#mv \1\2 \1\2#' -e 's#(.*)test([^/])#\1honban\2#' | sh

投稿2019/10/30 04:31

編集2019/10/30 04:39
hidezzz

総合スコア1248

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

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

kazumasamatsumo

2019/10/30 05:00

ありがとうございます。今の所確認していますが、再現ができていません。僕のテスト方法が間違っているのでできるまで粘ってみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問