私が知っているファイルが特定のディレクトリにコピーされている場合は、そのファイルのコピーが現在ある正確なパスを見つけたいと思います。ファイルは編集されず、コピーとまったく同じように表示されます。
ファイルがどこにあるかに関するいくつかの情報を知っているので、ディレクトリ全体とすべてのサブディレクトリを確認する必要はありません。これらのファイルには、ファイルのコピーが配置できる場所を絞り込むことが知られているRUNとVERSIONという2つの特性があります。
このソリューションは、diff
ファイルを比較したり、実際に表示したいディレクトリをgrep
選択したりするのに効果的です。find
しかし、私はそれらをどのように組み合わせるのかわかりません。
したがって、私たちはファイル(MYFILE=data.txt
)を持っていてJun-09/15/version3/run1
、そのコピーのパス(例えば)を知りたいと思います。たとえば、一部の特定のファイルでは、RUN=run1
この場合は「run2」ディレクトリを見てはいけません。同様に、私たちはVERSION=version3
この場合、version1またはversion2ディレクトリを見てはいけないことを知っています。ファイルのコピーがない可能性があることは注目に値し、この場合も知りたいです。
ファイル構造の説明:関連ディレクトリには、過去7年間の各月(たとえば「Jun-09」)のフォルダがあり、各サブディレクトリには、現在の月の各日付(たとえば「11」は11日を表します)のフォルダがあります。あります。次に、各「日」フォルダには各「バージョン」(関連データの3つの「バージョン」があります)のフォルダがあり、各フォルダには2つの「実行」があります。ただし、フォルダ内に時間ごとにファイルが整理されていても、ファイルが当月に作成されたか、最後に編集されたという保証はありません。
私の試み:上記の構造のルートで実行しようとしましたが、find . -type f -name data.txt | diff ~/myOtherdirectory/files/data.txt
「 '~/myOtherdirectory/files/data.txt'以降にオペランドがありません」というメッセージが表示され続けます。理想的には、私が見ているファイルとそのファイルが存在する可能性がある他のすべてのファイルとの違いを見つけることです。調べるためにディレクトリの範囲を絞り込むことはなく、実際にコピーのパスを取得することもありません。
答え1
私はあなたに提案します - あなたのソフトウェアに応じて - fslint、duff、fdupes、dmerge、rmlint、rdfind - それらはすべてfdupesまたはdupseekよりも速く双子を見つけることができるでしょう。
私は次を実行します:
$ find /path -type f -printf "%p - %s\n" | sort -nr -k3 | uniq -D -f1
答え2
myfile=/full/path/to/data.txt
mysearchpath=/my/search/path/root/directory
for file in $(find ${mysearchpath} -type f)
do
diff ${myfile} ${file} > /dev/null
result=${?}
if [ $result -eq 0 ]
then
echo "Identical file found at ${file}"
fi
done
これは非常に高価なアプローチですが(コンピューティングリソースの面で、特に他のタスクを実行している他の人とこのサーバーを共有する場合)。これらのファイルのチェックサムを生成し、特定の日付に追加されたファイルのチェックサムを生成するタスクを実行してフラットファイルに入れることができます。ファイルを見つける必要がある場合は、ファイルのチェックサムを作成し、それをチェックサムデータベースと比較します。考える距離だけでいいです。
答え3
定期的に確認する必要がある場合は、cronジョブを設定してファイルのmd5ハッシュダイジェストを作成できます。
echo > $digest_file; find $search_path -type f | xargs md5sum >> $digest_file
ファイルがコピーされた後にこれが実行されたと仮定した場合は、最初に既知のファイルのハッシュを見つけてから、リストを確認して、同じハッシュを持つ別のファイルがあることを確認してください。もちろん、パフォーマンスは検索パス内のファイルの数とサイズによって異なります。
これのもう1つの利点は、各実行前にダイジェストをコピーし、古いダイジェストと新しいダイジェストを比較すると、データの破損/変更を検出できることです。
答え4
そして:find
cmp
find . -type f -exec sh -c 'cmp -s data.txt "$0" 2>/dev/null && echo $0' {} \;
検索を制限するためにさらに基準を追加できます。