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

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

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

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

コマンド

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

Q&A

2回答

955閲覧

シェルコマンドを使ってファイル名やフォルダ名を変更したいその2

kazumasamatsumo

総合スコア41

シェルスクリプト

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

コマンド

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

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

シェル

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

0グッド

0クリップ

投稿2019/10/30 06:53

https://teratail.com/questions/220210

こちらの発展版です。

今度はtestを含むファイル名をtestの部分だけ変更したいです。

先ほどの記事の通りではうまくいかないことは確認済みです

~/test $ tree . ├── change.sh ├── set.sh ├── test-1 │ ├── test-1.1 │ │ ├── test_advance-1.1.1.txt │ │ ├── test_advance-1.1.2.txt │ │ └── test_advance-1.1.3.txt │ ├── test-1.2 │ │ ├── test_advance-1.2.1.txt │ │ ├── test_advance-1.2.2.txt │ │ └── test_advance-1.2.3.txt │ ├── test-1.2.1 │ ├── test-1.2.2 │ ├── test-1.2.2.1 │ └── test-1.3 │ ├── test_advance-1.3.1.txt │ └── test_advance-1.3.3.txt ├── test-2 └── test-3 └── test-3.txt 9 directories, 11 files

よろしくお願いします

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

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

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

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

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

Y.H.

2019/10/30 06:57

スクリプトの作成依頼ですか? 質問は何でしょうか? kazumasamatsumoさんは何を試されたのでしょうか? 推奨していない質問 https://teratail.com/help/avoid-asking > 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、 > 具体的にプログラミングで困っている質問ではないと考え、推奨していません。 > 問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。 > まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。
Y.H.

2019/10/30 07:07 編集

> 先ほどの記事の通りではうまくいかないことは確認済みです 先ほどの記事を見ても「うまくいかないこと」が何なのか記載されていないのでわかりません。 質問に記載ください。 誰かから出されている課題か何かをそのまま質問されてるんでしょうか・・・
Y.H.

2019/10/30 07:11

「ファイル名をtestの部分だけ変更したい」 のであれば、タイトルを適切に変更してください。 フォルダ名の変更は不要ですよね?
kazumasamatsumo

2019/10/30 07:30

スクリプトに対して理解を深めたいだけです。 ファイル名を一度に書き換えることができるものがあると知って知的好奇心からです。 としたらファイルの名前の一部分が含まれているものも変更するできるのでは?という疑問が出てきました。 ですが今回以前のような方法ではうまくいかず、何がよくて何が悪いのかわかりません。 ですので今回の質問をさせていただきました。 ですが、今回のようなプログラムに対する理解を深めたいとの思いの投稿が規約違反として捉えられるのようですので後ほど削除いたします。 ここはそういう世界とは知らず申し訳ありませんでした。 今後このような質問は控えさせていただきます。
Y.H.

2019/10/30 08:00 編集

> 今回のようなプログラムに対する理解を深めたいとの思いの投稿 であれば問題ないです。 が、 > 今回以前のような方法ではうまくいかず 「うまくいかず」とは、どの様な結果が欲しくて、何を試して、結果どうなって、欲しい結果とどう違うのかを、具体的に質問に記載されると、丸投げや作業依頼とは見られないと思います。 > 今回のようなプログラムに対する理解を深めたいとの思い これが伝わるように質問に記載されると誤解は無くなると思います。
guest

回答2

0

文字列処理でディレクトリ名とファイル名を分別処理して、mv一発で出来るファイル名にするのは、文字列処理にプログラム的な物を書かないといけなそうなので、pushdでディレクトリを移動してからファイル名(ディレクトリ含む)を変更します。Bash前提です。

Bash

1#!/bin/bash 2 3find -depth -name "*test*" | while read name 4do dir="${name%/*}" 5 file="${name##*/}" 6 pushd "$dir" 7 mv "$file" "${file//test/honban}" 8 popd 9done

先ほどの記事の通りではうまくいかないことは確認済みです

元のスクリプトで何がまずいかは、mvecho mvに変更して実行してみればわかりますね。

投稿2019/10/30 07:29

編集2019/10/30 07:48
otn

総合スコア85890

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

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

kazumasamatsumo

2019/10/30 07:32

ご回答ありがとうございます。 別の方から規約違反とのご指摘がありましたので削除させていただきます。 貴重な回答を無駄にしてしまい。誠に申し訳ありません。
otn

2019/10/30 07:38

技術者がプログラミングを行っている上で(あるいは、環境構築を行っている上で)ぶち当たった課題を質問するのが、本来の趣旨だと思いますが、 学習中の人が、理解しにくい部分を質問するのは、許容されている感じですね。 自分の課題感を質問文にちゃんと書けば良いのでは?
guest

0

(teratail.com)シェルコマンドでフォルダより以下の階層全ての名前を変更したい
でkazumasamatsumoさんがベストアンサーに選ばれている回答では
こちらの回答の方でした。
findコマンドが使用されているので、typeオプションを指定し、
対象をファイルのみにすればよいだけでは?

$ tree . ├── test-0 ├── test-1 │   └── test-1-1 │   └── test-1-1-1.txt └── test-2 └── test-2.txt $ find . -depth -type f | grep test | sed -e 's#(.*)(/[^/]*)#mv \1\2 \1\2#' -e 's#(.*)test([^/])#\1honban\2#' mv ./test-1/test-1-1/test-1-1-1.txt ./test-1/test-1-1/honban-1-1-1.txt mv ./test-2/test-2.txt ./test-2/honban-2.txt $ find . -depth -type f | grep test | sed -e 's#(.*)(/[^/]*)#mv \1\2 \1\2#' -e 's#(.*)test([^/])#\1honban\2#' | sh $ tree . ├── test-0 ├── test-1 │   └── test-1-1 │   └── honban-1-1-1.txt └── test-2 └── honban-2.txt

投稿2019/10/30 07:03

編集2019/10/30 07:45
Y.H.

総合スコア7918

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問