Bash:2つのファイル引数をソートしてexec findオプションを使用する

Bash:2つのファイル引数をソートしてexec findオプションを使用する

次の2つのディレクトリ間で同じファイル名を持つファイルを比較したいとします。

 /tmp/datadir/dir1/dir2/

そして

 /datadir/dir1/dir2/

必要タイプ比較する前に。

/tmp私は現在そのディレクトリにあり、次のオプションを使用して実行してみました。findexec

find datadir -type f -exec sdiff -s <( sort {} ) <( sort "/"{} ) \;

ただし、エラーが発生します。

並べ替え: オープン失敗: {}: そのファイルまたはディレクトリがありません。

並べ替え: オープン失敗: /{}: そのファイルまたはディレクトリがありません。

ただし、次のコマンドは正しく機能しますが、適切な比較のためにデータがソートされません。

find data -type f -exec sdiff -s  {}  "/"{} \;

この問題をどのように解決できますか?

答え1

交換は、コード内のプロセス交換()などの評価によって{}行われ、発生します。find<(…)

使用bash -c:

find datadir -type f -exec \
  bash -c 'sdiff -s <( sort "$1" ) <( sort "/$1" )' bash {} \;

または、bashファイルごとに1つのインスタンスを実行しないでください。

find datadir -type f -exec bash -c '
  for file do
    sdiff -s <( sort "$file" ) <( sort "/$file" )
  done' bash {} +

答え2

-rすべての並べ替えと再帰を実行する(再帰)オプションの使用を検討できます。

関連情報