web-dev-qa-db-ja.com

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

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

 /tmp/datadir/dir1/dir2/

そして

 /datadir/dir1/dir2/

比較する前にsortそれらを行う必要があります。

私は現在/tmpディレクトリ、そして私はこのfindexecオプションで実行しようとしました:

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

しかし、それは私にエラーを与えます

並べ替え:開くことができませんでした:{}:そのようなファイルまたはディレクトリはありません

並べ替え:開くことができませんでした:/ {}:そのようなファイルまたはディレクトリはありません

ただし、以下のコマンドは正常に機能しますが、データは適切に比較するために並べ替えられません。

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

この問題を解決するにはどうすればよいですか?

4
Kaushik Nayak

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

_bash -c_の使用:

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

または、ファイルごとに1つのbashインスタンスを実行しないようにするには:

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

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

1
RalfFriedl