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

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

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

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

sh

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

Q&A

解決済

1回答

861閲覧

s2重ループ以外の方法

kty_kk

総合スコア4

bash

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

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

sh

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

0グッド

0クリップ

投稿2021/07/21 08:04

編集2021/07/22 03:49

現在ソースを自動で比較するツールを作成しています。
2つのディレクトリの同一順番のファイル同士をdiffで差分を取り、ファイル名_diffの様な名前で結果を別ファイルに出力しようと考えております。

sh

1#!/bin/sh 2 3#比較元①ファイル一覧リスト(パス付) 4find ./bk* -type f >bkfile.txt 5#比較元➁file一覧リスト(パス付) 6find ./new* -type f >newfile.txt 7#ファイル名一覧リスト 8find ./bk* -type f | awk -F/ '{print $NF}' >filename.txt 9 10#比較元ファイル①と➁をカンマ区切りで結合(後のcutコマンドで使用) 11paste -d "," bkfile.txt newfile.txt >join.txt 12#各行末に , を挿入(後のcutコマンドで使用) 13sed -i 's/$/,/g' join.txt 14 15#各行に比較する二つのファイルがカンマ区切りで記載されている状態(join.txt) 16#各行を読み取りループ 17while read row;do 18 19   #ファイル名ループ 20   while read name;do 21 22   column1=`echo ${row} | cut -f 1 -d ","` 23   column2=`echo ${row} | cut -f 2 -d ","` 24 25~~~省略(様々なパターンでdiff処理)~~~~~~~~ 26 27   diff -y $column1 $column2 >{name}_diff.txt 28 29  done<filename.txt 30 31done<join.txt 32

差分を取り、出力するdiffのファイル名(${name}_diff.txt)を設定したいです。
2重ループで一旦書いてみましたが、うまく行きませんでした。
※考えてみれば当たり前なのですが、ファイル名一覧でループした後、更に比較ファイル一覧でループするからです。

diffを取る際に出力するファイル名を、事前に用意したファイル名一覧(filename.txt)と紐づけて出力する方法はないでしょうか。

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

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

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

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

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

otn

2021/07/21 12:29

awk -F は awk -F/ の間違いで、pate は paste の間違いでしょうか? 実際に動かしたコードをコピペしましょう。
otn

2021/07/21 12:46

日本語からもコードからもやりたいことが読み取れません。 「2つのディレクトリの同一順番のファイル同士を比較する」 がやりたいことの基本でしょうか? そうならば、その基本に追加してやりたいことは何でしょうか?
kty_kk

2021/07/22 03:50

申し訳ありません。 ご認識の通りです。 同一順番のファイル同士の比較はできているのですが、事前に用意したファイル名一覧(filename.txt)を紐づけて、出力ファイルのファイル名に変数として使用したいです。
guest

回答1

0

ベストアンサー

同一順番のファイル同士の比較はできているのですが、事前に用意したファイル名一覧(filename.txt)を紐づけて、出力ファイルのファイル名に変数として使用したいです。

そこまで出来ていて何故出来ないのか不思議です。
元のコードをできるだけ変えないと、こんな感じで。

Bash

1paste -d "," bkfile.txt newfile.txt filename.txt >join.txt 2sed -i 's/$/,/g' join.txt ## これの意味が不明。不要では? 3 4while read row;doープ 5   column1=`echo ${row} | cut -f 1 -d ","` 6   column2=`echo ${row} | cut -f 2 -d ","` 7   column3=`echo ${row} | cut -f 3 -d ","` 8 9~~~省略(様々なパターンでdiff処理)~~~~~~~~ 10 11   diff -y $column1 $column2 > ${column3}_diff.txt 12done<join.txt

区切りをカンマにしていると言うことは、ファイル名パスに空白が含まれるんでしょうか?
空白区切りで良ければもっとシンプルに書けます。

投稿2021/07/22 03:58

otn

総合スコア84423

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

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

kty_kk

2021/07/26 05:25

解決することが出来ました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問