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.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

관련 정보