私は初めて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
答え2
fdupes
各ファイルのmd5ハッシュを計算してこれを実行するように特別に設計されているようなツールを使用してください。同じディレクトリを2回指定するとデータが失われるなど、いくつかの注意事項があるため、ここでは具体的な詳細を提供しません。たとえば、/home/ を指定する場合そして~/その間、ホームディレクトリ内のファイルは重複ファイルとして一覧表示されます。重複エントリを自動的に削除するようにfdupesを設定すると、ホームディレクトリのすべてのファイルが削除されます。
おそらく最も有用なのはman fdupes
CLIに入力することです。これにより、すべてのオプションを含むマニュアルが表示されるので、これを使用する最良の方法が何であるか、どのオプションを使用したいのか、使用しないのかを自分で知ることができます。これらの警告は恐れているのではなく、注意が必要です。これはおそらくこれらのツールの機能をよりよく理解することができるので、これらのツールを使用するように訓練するための最良の方法です。回答で提供されたアドバイスを「盲目的に」コピーして貼り付けると、これらの利点は得られません。
利用可能なツールがない場合は、ディストリビューションがそれをリポジトリに提供する可能性が高くなります。なぜなら、このツールは多くの人が選ぶコマンドラインツールだからです。
fslint
あるいは、明らかに便利なGUIベースのツールであるこのツールを検討してください。私が自分で試したことがないので、たくさん話すことはできません。