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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

3回答

258閲覧

MacOSでフォルダ・ファイル名を一括置換するbashを作りたい

kymst

総合スコア6

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2020/01/27 08:09

前提・実現したいこと

フォルダ・ファイル名を特定の文字へ一括置換するbashをMacOSで作成したいと考えています
フォルダ名も同時に変換したいのですが下に書いてあるエラーが発生してしまい変換できません
対処法をお教えください

renameコマンドをインストールしています
https://qiita.com/shuhei/items/cf1ddf373d1f83d5d667

例:理想的な動作

  • 変換前
. ├── before_xxx.txt ├── xxx_before.md └── hogehoge    ├── before.txt    ├── hogehoge.txt    └── xxx_before       ├── hogehoge.txt       └── before.md
  • 変換後
. ├── after_xxx.txt ├── xxx_after.md └── hogehoge    ├── after.txt    ├── hogehoge.txt    └── xxx_after       ├── hogehoge.txt       └── after.md

試作コード

replace.sh

dir=$1 before=$2 after=$3 find $dir -type f -name "*${before}*" -print0 | xargs -0 rename -s $before $after

実行結果

エラー

Can't rename './hogehoge/xxx_before/before.md' to './hogehoge/xxx_after/before.md': No such file or directory

フォルダ名がxxx_afterに変換がかかることでファイルが見つけられない?

結果

replace.sh . before after

. ├── after_xxx.txt ├── xxx_after.md └── hogehoge    ├── after.txt    ├── hogehoge.txt    └── xxx_before       ├── hogehoge.txt       └── before.md

xxx_beforeが変換されておらずその中に含まれるbefore.mdも変換されていません

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

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

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

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

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

guest

回答3

0

ベストアンサー

macOS bashで書いてみました

bash

1#!/bin/bash 2 3if [ $# -ne 3 ]; then 4 echo "param error" 5 exit 6fi 7 8dir=$1 9before=$2 10after=$3 11 12find $PWD/$dir -type d |sort -r |while read dd 13do 14 cd $dd 15 rename -s $before $after $(ls -F |grep -v /) 16 rename -s $before $after ../${dd##*/} 17done

投稿2020/01/27 10:14

編集2020/01/27 14:47
amura

総合スコア333

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

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

kymst

2020/01/28 05:49

ソースコードまで親切にありがとうございます とても参考になりました!
guest

0

xxx_afterが無いからですね。ファイルの前にディレクトリをリネームしましょう。

なお、普通の人はbashを作ることは無いです。
作るのは、「bashスクリプト」ですね。

投稿2020/01/27 08:54

otn

総合スコア84557

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

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

0

bashを作るとは…


というのは置いておいて、存在しないディレクトリにはファイルを作らない仕様でしょう。というかmvコマンドだってそうですよね。
ディレクトリ名まで再帰的に処理するスクリプトを組まれるのが良いかもしれないですね。

投稿2020/01/27 08:28

Takumiboo

総合スコア2534

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問