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

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

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

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

1回答

263閲覧

ファイルの中身とディレクトリ名を置換

tommyTeratail

総合スコア31

bash

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

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2023/11/02 01:56

実現したいこと

ファイルの中身とディレクトリ名を置換したいです。

ファイルの中身は、下記ので対応しています。ディレクトリ名を変える方法が思いつきません。

bash

1find . -name '*.txt' | xargs sed -i "" 's/__target__/new/g'

条件

下記のような条件です。

  • macで実行可能である事
  • 大文字小文字なども判別つく
  • ライブラリ依存が無いと嬉しい

ディレクトリ構成は一例ですので、ハードコーディングで置換はできないです。
zshで実行可能であれば、ワンライナーでなくても大丈夫です。

期待の結果

before

bash

1❯ tree 2. 3├── __target__1 4│   ├── __target__A 5│   │   ├── apple__Target__ 6│   │   │   └── __target__Foo.txt 7│   │   └── orange__Target__ 8│   └── __target__B 9│   └── __target__Bar.txt 10└── __target__2

bash

1cat __target__1/__target__B/__target__Bar.txt 2__target__ タイトル 3 4Barです。

bash

1cat __target__1/__target__A/apple__Target__/__target__Foo.txt 2__target__ タイトル 3 4Fooです。

after

bash

1❯ tree 2. 3├── new1 4│   ├── newA 5│   │   ├── appleNew 6│   │   │   └── newFoo.txt 7│   │   └── orangeNew 8│   └── newB 9│   └── newBar.txt 10└── new2

bash

1cat new1/newB/newBar.txt 2new タイトル 3 4Barです。

bash

1cat new1/newA/appleNew/newFoo.txt 2new タイトル 3 4Fooです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下、GNU find を利用する場合。
※ macos にデフォルトでインストールされている find コマンド(おそらく BSD 由来)が提供しているオプションの詳細に関しては私には分かりませんので、Homebrew などで GNU find を別途インストールする必要があるかもしれません

bash

1$ find --version 2find (GNU findutils) 4.9.0 3$ find . -depth -iname '*__target__*' -execdir sh -c 'mv -n "$1" $(echo "$1" | sed "s/__target__/new/;s/__Target__/New/;")' -- {} \;

投稿2023/11/02 02:44

編集2023/11/02 03:23
melian

総合スコア19825

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

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

tommyTeratail

2023/11/02 03:19

ありがとうございます。 下記の状況で検証しましたが、うまく動作しませんでした。 mac の環境なので、そのあたりが原因かもしれません。 ```bash # brew install findutils をインストール gfind --version find (GNU findutils) 4.9.0 ``` ```bash # gfind で実行 gfind . -depth -iname '*__target__*' -execdir sh -c 'mv "$1" $(sed "s/__target__/new/;s/__Target__/New/;")' -- {} \; # ctrl c で終了 ^C ```
melian

2023/11/02 03:24

ごめんなさい、回答へ転記する際に sed の前に echo "$1" | を付け忘れていました。回答を編集しましたのでお試し下さい。
tommyTeratail

2023/11/02 03:29

期待の動作です。 ありがとうございます。 ディレクトリの再起の置換は、難しくて苦戦していました。 しかもワンライナー...最高です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問