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" "{}" "{}"

私は。fdfind

パターンに一致するすべてのファイルを検索し、,3 番目の文字から始めて出力分割を数値でソートします。

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

関連情報