비슷한 이름의 파일 찾기, 가장 오래된 파일 삭제, 최신 파일 이름 바꾸기

비슷한 이름의 파일 찾기, 가장 오래된 파일 삭제, 최신 파일 이름 바꾸기

서로 다른 하위 폴더에 비슷한 이름을 가진 파일이 많이 있는 상황이 발생했습니다(그러나 모두 특정 패턴을 따랐습니다).

file1
file1 (Copy)
/folder1/file2.txt
/folder1/file2 (Copy).txt
/folder1/file3.png
/folder1/file3 (Copy).png

각 파일은 복사본과 동일한 폴더에 있으며 (Copy)이름 끝에 있다는 점을 제외하면 확장자가 동일합니다.

file1 (Copy)이 모든 파일을 가져오고 가장 오래된 파일을 삭제한 다음 결국 파일 이름을 바꿔야 하는 경우 ( file1예: 접미사 제거) 파일 이름을 바꾸고 싶습니다 .(Copy)

사용하려고 하는데 find가장 mv가까운 것을 이동하라고 어떻게 말해야 할지 모르겠습니다.

답변1

확장하다find+bash솔루션(GNU 구현도 필요함 stat):

find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}"; 
        main_bn="${bn/ (Copy)/}"; 
        if [ -f "$p/$main_bn" ]; then 
           t_copy_file=$(stat -c %Y "$0"); t_main_file=$(stat -c %Y "$p/$main_bn"); 
           if [[ $t_copy_file -gt $t_main_file ]]; then 
               mv "$0" "$p/$main_bn"; 
           else
               rm "$0"; 
           fi; 
        fi' {} \;

  • p="${0%/*}"- 기본 이름이 잘린 파일 경로/경로
  • bn="${0##*/}"- 파일의 기본 이름
  • main_bn="${bn/ (Copy)/}"(Copy)- 가져오려면 기본 이름에서 하위 문자열을 제거하세요.메인/퍼블릭기본 이름
  • if [ -f "$p/$main_bn" ]- 만약에메인/원본파일이 존재합니다(심볼릭 링크 확인 후 일반 파일로 확인됨).
    • t_copy_file=$(stat -c %Y "$0")- 마지막으로 수정된 시간을 확인하세요."복사"문서
    • t_main_file=$(stat -c %Y "$p/$main_bn")- 마지막으로 수정된 시간을 가져옵니다.원래문서
    • if [[ $t_copy_file -gt $t_main_file ]]- 만약에"복사"파일이 최근임 - 다음으로 이동원래에(만들어봐원래) 그리고mv "$0" "$p/$main_bn"
    • 그렇지 않으면원래파일이 최신입니다. '삭제하세요.복사"문서와rm "$0"

-nt또는 파일 테스트 연산자를 사용하여 더 짧은 것( - 이후에 변경되었는지 또는 존재하지만 존재하지 않는지 [ new­er­file –nt olderfile ]확인 ):newerfileolderfilenewerfileolderfile

find . -type f -name "* (Copy).*" -exec bash -c 'p="${0%/*}"; bn="${0##*/}"; 
        main_bn="${bn/ (Copy)/}"; 
        if [ -f "$p/$main_bn" ]; then 
           if [ "$0" -nt "$p/$main_bn" ]; then 
               mv "$0" "$p/$main_bn"; 
           else
               rm "$0"; 
           fi; 
        fi' {} \;

답변2

사용하기가 더 쉬울 수 있습니다 zsh.

setopt extendedglob # best in ~/.zshrc
for file (./**/?*" (Copy)"*(ND.)) {
  base=$file:h/${${file:t}/" (Copy)"}}
  [[ ! -f $base || -L $base ]] ||
    if [ $file -nt $base ]; then
      mv $file $base
    else
      rm -f $file
    fi
}

파일이 없는지 먼저 확인하는 것이 좋습니다 file (Copy) (Copy).txt.

  • **/: 모든 수준의 하위 디렉터리
  • N:빈 공일치하는 항목이 없으면 오류 대신 비어 있는 상태로 확장됩니다.
  • D:숨겨진 파일( D또는 파일)을 포함하고 숨겨진 디렉터리에 놓습니다.
  • .:만 포함정기적인파일(디렉토리, fifo, 장치, 심볼릭 링크 없음...)
  • $file:h:머리파일(디렉토리 부분), 예:csh
  • $file:t:꼬리(파일명 부분)
  • ${var/pattern/replacement}, 여기에는 대체품이 없습니다.
  • [[ ! -f $base || -L $base ]] ||...보호 조치로 틀에 얽매이지 않는 파일이나 기호 링크(일반 파일을 가리키는 경우에도)를 건너뜁니다.
  • [ $file -nt $base ]$file: 마지막으로 수정된 경우 true를 반환합니다.뒤쪽에 $base(또는 $base위의 확인 후에 발생해서는 안 되는 접근성).

관련 정보