Bash:通过对两个文件参数进行排序来使用 exec find 选项

Kau*_*yak 4 bash find sort

假设我想比较这两个目录之间具有相同文件名的文件:

 /tmp/datadir/dir1/dir2/
Run Code Online (Sandbox Code Playgroud)

 /datadir/dir1/dir2/
Run Code Online (Sandbox Code Playgroud)

在比较之前需要它们进行排序

我目前在/tmp目录中,我尝试find使用以下exec选项运行它:

find datadir -type f -exec sdiff -s <( sort {} ) <( sort "/"{} ) \;
Run Code Online (Sandbox Code Playgroud)

但是,它给了我一个错误

排序:打开失败:{}:没有这样的文件或目录

排序:打开失败:/{}:没有这样的文件或目录

但是,下面的命令工作正常,但没有对数据进行排序以进行适当的比较。

find data -type f -exec sdiff -s  {}  "/"{} \;
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

phk*_*phk 10

的替换{}由您的代码find中的进程替换 ( <(…)) 等评估完成并发生。

使用bash -c

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

或者避免bash为每个文件运行一个实例:

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