[解決済み] find と sed を使って再帰的にファイル名を変更する
2023-03-27 20:14:07
質問
私はディレクトリの束を調べて、_test.rb で終わるすべてのファイルを、代わりに _spec.rb で終わるように名前を変えたいと思います。それは、私が bash で行う方法を決して理解しなかったことなので、今回は、それを釘付けにするためにいくつかの努力をしようと思いました。しかし、私は今のところ、私の最高の努力は不足しています。
find spec -name "*_test.rb" -exec echo mv {} `echo {} | sed s/test/spec/` \;
注:execの後にechoが追加されていますが、これはテスト中にコマンドが実行されるのではなく、表示されるようにするためです。
実行すると、一致した各ファイル名の出力は次のようになります。
mv original original
というように、sedによる置換が失われています。何かコツがあるのでしょうか?
どのように解決するのですか?
この現象は
sed
は文字列
{}
で確認できるように、入力として受け取ります。
find . -exec echo `echo "{}" | sed 's/./foo/g'` \;
と表示されます。
foofoo
を表示します。この動作の理由は、パイプラインはシェルがコマンド全体を展開する際に一度だけ実行されるからです。
を引用する方法はありません。
sed
のような形でパイプラインを引用する方法はありません。
find
はすべてのファイルに対して実行されます。
find
はシェル経由でコマンドを実行せず、パイプラインやバッククォートの概念も持っていないからです。GNU findutils マニュアルでは、パイプラインを別のシェル スクリプトに置くことによって同様のタスクを実行する方法を説明しています。
#!/bin/sh
echo "$1" | sed 's/_test.rb$/_spec.rb/'
(何か変な使い方があるかもしれませんが
sh -c
と大量の引用符を使うことで、1つのコマンドでこれらすべてを行うという、何か変な方法があるかもしれませんが、試すつもりはありません)。
関連
-
[解決済み] OS X で 'find' コマンドを使用して 'sed' を使用するとエラーが発生する。"無効なコマンドコードです。"
-
[解決済み] Linuxで特定のテキストを含むすべてのファイルを検索するにはどうすればよいですか?
-
[解決済み] sedで改行をスペースに置き換えるには?
-
[解決済み] bashと正規表現を使って1行でプロセスを検索してkillする
-
[解決済み] Bashコマンドからテキストファイルの内部を検索・置換する
-
[解決済み】bash/sedスクリプトを使用してテキストファイルの最初の行を削除するにはどうすればよいですか?
-
[解決済み] bashで端末の最終行を削除して置換するには?
-
[解決済み] MSYSでフォルダを閲覧する
-
[解決済み] 接頭辞・接尾辞を使った名前の変更方法について教えてください。
-
[解決済み] Bashでテーブルの列を揃えるにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] シェルスクリプトを使用して、ファイル名の特定のパターンを置き換えて複数のファイル名を変更する [複製]
-
[解決済み] bashのループリストで空白をエスケープするには?
-
[解決済み] このbashのフォーク爆弾はどのように機能するのでしょうか?重複
-
[解決済み] bashでスクリプトの中で宣言された変数をリストアップする方法は?
-
[解決済み] Bashでコマンドライン引数を変更するには?
-
[解決済み] 最終編集日順のファイル一覧
-
[解決済み] Bashのコマンドラインと入力制限
-
[解決済み] Bashでテーブルの列を揃えるにはどうしたらいいですか?
-
[解決済み] 環境変数の指定とエコーを同じコマンドラインで実行できないのはなぜですか?
-
[解決済み] BashやShellスクリプトで関数の前方宣言を行うには?