xargs printf 语句中的字符串删除?

xargs printf 语句中的字符串删除?

目前我的mbsync错误是一堆重复的UIDs.这意味着我必须找到所有具有子字符串重复项的文件"U=[0-9]+:",并更改最新的文件以删除该子字符串。

例如,一个文件的简单情况是:

$> fd ".*U=17:.*" --exec ls -la {} \;
-rw-------  1 djm  staff  95903 Mar  2 06:57 cur/1583291317.13980_115.DJM2,U=17:2,ST
-rw-------  1 djm  staff  13654 Sep 30  2015 cur/1580615936.64042_2698.DJM2,U=17:2,S
$> mv ./cur/1583291317.13980_115.DJM2,U=17:2,ST ./cur/1583291317.13980_115.DJM2

问题是,我还有大约 1000 个这样的事情要做。所以我正在努力

  1. 查找具有该匹配子字符串的所有文件,
  2. 按匹配的子字符串对它们进行排序,
  3. 仅显示重复的匹配文件
  4. 在这些重复项中,更改最新文件的名称以删除该子字符串。

我无法找到所有重复项,同时保持文件路径完整以便稍后更改文件名时使用。

这是我到目前为止所拥有的:

fd ".*U=[0-9]+:.*" | sort -t , -k2.3n | xargs -I{} printf "%s\t${%s//.*,}\n" "{}" "{}"

请注意,我使用fd类似于 的rust 实用程序find

我找到与模式匹配的所有文件,然后,从第三个字符开始对输出拆分进行数字排序。

uniq -d这就是我在将其过滤为重复项时遇到麻烦的地方,因为由于文件路径的原因,仅仅通过管道输入不会给我带来任何好处。所以我在想,我可以将printf子字符串与文件路径分开,然后将其通过管道传输到uniq -d.

我不太确定如何继续前进。答案将告诉我如何根据指定的子字符串将输出过滤到重复的文件路径。

答案1

感谢 Heysus 的建议,我通过添加额外的步骤找到了解决方案,

x=($(ls -lR ./cur | grep -o 'U=.*:' | sort -k1.3n | uniq -d))

for i in "${x[@]}"; do                                                                                        
  y=$(fd ".*${i}" --exec gstat -c '%X %n' \; | sort -nr | awk 'NR==1,NR==1 {print $2}')
  newy=$(echo "$y" | sed 's/,.*//g')
  mv "$y" "$newy"
done

相关内容