違いがなければ、ファイルを削除する

違いがなければ、ファイルを削除する

私は初めてbashに触れました。以下を行う必要があります。

  • ディレクトリAとディレクトリBで同じ名前のフォルダに移動します。
  • 同じ名前の2つのファイルを見つけて比較します(私はdiff <(ファイル 1) <(ファイル 2 ソート)ファイル比較)
  • 違いがない場合は、Aディレクトリのファイルを削除してください。
  • 違いがある場合は、次の一致するファイルのペアを無視して処理します。
  • 各ディレクトリの次のフォルダを確認し、一致するフォルダがすべて確認されるまでプロセスを繰り返します。

たとえば、AIディレクトリでは、フォルダAには2つのファイル(ファイル1とファイル2)があります。ディレクトリBIでは、フォルダAには3つのファイル(ファイル1、ファイル2、ファイル3)があります。

  • File1 は両方のディレクトリで同じです。ディレクトリAから削除されました。
  • file2には違いがあります。両方のディレクトリに残ります。
  • file3 は何もしません。 - ディレクトリBに残ります。

私が使用するファイルはxmlファイルです。ファイルのタグ順は時々異なる場合がありますが、ファイルを保持したい項目が追加されない限り、内容はまったく同じです。タグの順序が異なるかどうかは重要ではなく、すべてが同じか異なるかを確認したいと思います。より明確に提供されることを願っています。

どんな助けでも大変感謝します。

修正する:

だから私はこれをしましたが、スクリプトを実行するとコンソールの出力は空です。見つかったのと同じファイルを一覧表示して削除する必要があります。どこが間違っていますか?

スペース

            declare -a my_array
            shopt -s globstar
            cd /mnt/c/filediff/validation/applications/

            for file in **; do
                if [ -d "$file" ]; then 
                    echo "$file is a directory, skipping."; 
                else
                    fileName=${file#*/}
                    if [[ -e /mnt/c/filediff/package/"$fileName" ]]; then
                        echo diff -q <(sort "$file") <(sort /mnt/c/filediff/package/"$fileName") && 
            my_array=("${my_array[@]}" "$fileName")
                        #rm /mnt/c/filediff/package/"$fileName" 
                    fi
                fi
            done
            echo -e '\nRemoved the following files -----------------------------------'
            for item in "${my_array[@]}"
            do
                echo "ITEM: *** $item ***"
            done

ベストアンサー1

次のことができます。

for file in /path/to/dirA/*; do
    fileName=${file##*/}
    diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
    rm /path/to/dirB/"$fileName"
done

これは、ファイル内のすべてのファイルを繰り返してdirA各ファイルをとして保存します$file$fileパスが含まれるため、ファイル名を取得する必要があります。最後のスラッシュ/path/to/dirA/file1()すべてのコンテンツを達成する前に。次に、ファイルをディレクトリBの同じ名前のファイルと自動的に比較し、同じ場合、正常に終了したらディレクトリBからファイルを削除します。これは、「このコマンドが成功した場合にのみ次のコマンドを実行します」という意味で、ファイルが同じ場合にのみ実行されます。file1fileName=${file##*/}diff&&rm

再帰的に作成するには、次のものを使用するとしますbash

shopt -s globstar
cd /path/to/dirA/
for file in **; do
    fileName=${file#*/}
    echo diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
    rm /path/to/dirB/"$fileName"
done

あるいは、より複雑には、ディレクトリと存在しないファイルをスキップします。

shopt -s globstar
cd /path/to/dirA/
for file in **; do
    if [ -d "$file" ]; then 
        echo "$file is a directory, skipping."; 
    else
        fileName=${file#*/}
        if [[ -e /path/to/dirB/"$fileName" ]]; then
            echo diff -q <(sort "$file") <(sort /path/to/dirB/"$fileName") && 
            rm /path/to/dirB/"$fileName"
        fi
    fi
done

おすすめ記事