백업 버전을 파일 이름의 접미사로 사용하고 더 이상 숨기지 않도록 백업 파일의 이름을 바꾸는 방법

Aug 17 2020

많은 수의 이미지 파일로 작업하고 있습니다. 이 중 일부는 1000 개 이상의 디렉토리에 분산 된 모든 이미지 파일 유형을 단일로 직접 이동하는 것이 었습니다. 이름은 똑같지 만 실제로는 다른 사진이 많았습니다. 이를 위해 다음 한 줄을 사용했습니다.

find . -type f -exec mv --backup=t '{}' /media/DATA-HDD/AllImages \;

같은 이름을 가진 이미지는 덮어 쓰는 대신 숨겨진 백업 파일을 만들도록 이렇게했습니다. 매우 잘 작동했지만 이제 해결해야 할 또 다른 문제가 있습니다.

이제 다음과 같은 타일이 많이 있습니다.

DSC_0616.NEF
DSC_0616.NEF.~1~
DSC_0616.NEF.~2~

내가하려는 것은 명령 (또는 스크립트)을 실행하는 것입니다.이 파일은 백업 번호를 파일 이름에 접미사로 추가하여 숨겨진 파일의 이름을 바꾸고. ~ [bu #] ~를 제거하여 고유하게 만듭니다. 파일 이름 및 숨김 없음. 그래서 이렇게 :

DSC_0616.NEF
DSC_0616_1.NEF
DSC_0616_2.NEF

나는 이것을 시도하기 위해 조사하기 위해 몇 시간의 더 나은 부분을 보냈지 만, 주제에 대한 나의 지식 영역 내에서 내가 거기에 도달하는 데 도움이 될 수있는 것을 실제로 찾을 수 없습니다.

답변

1 Minty Aug 17 2020 at 09:57

위에서 설명한대로 모든 이름이 일관되게 명명된다는 것을 확신하는 한, 일부 정규식은 쉘 스크립트를 통해 작업을 수행 할 수 있습니다.

#!/bin/bash
# sets the file separator to be only newlines, in case files have spaces in them
IFS=$'\n' for file in $(find . -type f); do
        # parses just the number(s) between two tildes, and only at the end of the file
        number=$(echo $file | grep -Eo "~[0-9]+~$" | sed s/'~'/''/g) # if no match found, assume this is a "base" file that does not need to be renamed if [ "$number" == "" ]; then
                continue
        fi
        # parses the file name through "NEF", then deletes ".NEF"
        filename=$(echo $file |  grep -Eio "^.+\.NEF" | sed s/'\.NEF'/''/g )
        if [ "$filename" == "" ]; then continue fi mv -v $file $(echo "$filename"_"$number.NEF") # if anything went wrong, exit immediately if [ "$?" != "0" ]; then
                echo "Unable to move file $file"
                exit 1
        fi
done

이것은 디렉토리 내림차순에서도 작동합니다. 스크립트를 배치하고 프로젝트의 디렉토리 트리 맨 위에 작업 디렉토리로 실행하십시오. 제공 한 예제 파일로 실행 :

###@###:~/project$ find . -type f
./DSC_0616.NEF.~8~
./DSC_0616.NEF.~5~
./DSC_0616.NEF.~1~
./DSC_0616.NEF.~7~
./DSC_0616.NEF.~3~
./DSC_0616.NEF.~4~
./DSC_0616.NEF.~9~
./DSC_0616.NEF.~2~
./DSC_0616.NEF.~6~
./lower_dir/DSC_0616.NEF.~8~
./lower_dir/DSC_0616.NEF.~5~
./lower_dir/DSC_0616.NEF.~1~
./lower_dir/DSC_0616.NEF.~7~
./lower_dir/DSC_0616.NEF.~3~
./lower_dir/DSC_0616.NEF.~4~
./lower_dir/DSC_0616.NEF.~9~
./lower_dir/DSC_0616.NEF.~2~
./lower_dir/DSC_0616.NEF.~6~

스크립트 실행 후 :

###@###:~/project$ find . -type f
./DSC_0616_1.NEF
./DSC_0616_3.NEF
./DSC_0616_7.NEF
./DSC_0616_5.NEF
./DSC_0616_2.NEF
./DSC_0616_9.NEF
./DSC_0616_6.NEF
./DSC_0616_8.NEF
./DSC_0616_4.NEF
./lower_dir/DSC_0616_1.NEF
./lower_dir/DSC_0616_3.NEF
./lower_dir/DSC_0616_7.NEF
./lower_dir/DSC_0616_5.NEF
./lower_dir/DSC_0616_2.NEF
./lower_dir/DSC_0616_9.NEF
./lower_dir/DSC_0616_6.NEF
./lower_dir/DSC_0616_8.NEF
./lower_dir/DSC_0616_4.NEF