私は初めて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からファイルを削除します。これは、「このコマンドが成功した場合にのみ次のコマンドを実行します」という意味で、ファイルが同じ場合にのみ実行されます。file1
fileName=${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