フォルダー比較


10

サブフォルダー構造が似ている2つのフォルダーがあります。比較したいと思います。例えば:

A 
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5

そして

B 
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text

のサブフォルダーのAプレフィックスであるすべてのサブフォルダーBを一覧表示し、対応するサブフォルダーBも同様に一覧表示します。期待される出力は

child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing

2番目の要件:複数のがで一致する場合B、エラー/警告が表示されます。

私の解決策

cd A
for f in `ls -d */`; 
do
    cd B;
    new_dirs=(`ls -1d $f*`);
    cd -;
    if [ ${#new_dirs[@]} -eq 0 ]
    then
        ## DO_Nothing
        continue;
    elif  [ ${#new_dirs[@]} -gt 1 ]
    then
        echo "Multiple matches to $f";
        continue;
    else
        echo "Unique Match found to $f -- ${new_dirs[0]}";
        continue;
    fi;    
done

問題:

$f対応するサブフォルダーがないの値の場合B、配列の構築によりエラーが発生します。例えば:

ls: 'child-4 *'にアクセスできません:そのようなファイルまたはディレクトリはありません

質問

  • これらのエラーを取り除く方法は?
  • コード内のものよりも目的を達成するためのより良い方法はありますか?

前もって感謝します!


4
ほぼ機能するソリューションを提供するための+1!
user5325

これは特定の質問に対する回答ではありませんが、diff -rq DIR1 DIR2ディレクトリ構造だけでなくファイルの内容を比較するために使用できます。
jrw32982は、

回答:


10

より良い方法

解析しないでくださいls。代わりにグロブを使用してください。実際、あなたはすでにグロブを使用しており、それらをでラップするだけですがls、これは無意味です。nullglob一致するものがないときにオンにする必要があります。

また、回避するcdことで物事が簡素化されます。

#!/bin/bash

shopt -s nullglob

dir1=A
dir2=B

for dir in "$dir1"/*/; do
    basename="$(basename -- "$dir")"
    dirs_match=( "$dir2/$basename"*/ )
    case ${#dirs_match[@]} in
    0)
        ;;
    1)
        echo "Unique match for $dir: ${dirs_match[*]}"
        ;;
    *)
        echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
        ;;
    esac
done

出力:

Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/

B/child-3-something二次要件をテストするために追加しました。これにより、テスト用のディレクトリ構造が作成されます。

mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}

ちなみに、ShellCheckはシェルスクリプトの問題を見つけるのに非常に便利です。


ShellCheck.netは興味深いですが、すべてを自分のサーバーにアップロードするのか、それともすべてローカルで行うのか知っていますか?入力した情報のプライバシーについて疑問に思っています。[ shellcheckパッケージのインストールが最も安全です]
Xen2050 2019年

@ Xen2050サイト上でインターネットをオフに切り替えてみたところ、アップロードされたようです。私はそれがそれを維持しないと想像しますが、確かではありません。はい、パッケージは良好です。私はそれを使用するAtomプラグインを使用しています。
wjandrea

提案をありがとう。そして、に向けてくれてありがとうShellCheck。エラーを通知するだけでなく、提案を行う部分も気に入りました。@ Xen2050、アップロード部分については、ネットワークshellcheckを使用aptしてインストールした後、無効にしました。インターネットなしで動作しているようです。
Mike VDC

2

ls存在しないフォルダを呼び出すと、発生したエラーメッセージがスローされます。簡単な方法は、スクリプトの5行目を次のように置き換えるだけで、これを無視することですnew_dirs=(`ls -1d $f* 2> /dev/null`);


これをテストしましたか?stderrはデフォルトで無視されるようです。t=(`echo ok; echo err 1>&2`)$ t(または${t[@]})を実行したときにokしか含まれていない場合、ターミナルにエラーが表示されますが、保存されません。それとも私のテストについて何か面白いことはありますか?
Xen2050
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.