이름 바꾸기 명령은 여러 파일을 삭제하는 것 같습니다. 복원할 수 있나요?

이름 바꾸기 명령은 여러 파일을 삭제하는 것 같습니다. 복원할 수 있나요?

우분투 22.04 사용

여러 파일이 포함된 폴더가 있는데 파일 확장자를 변경하고 싶어서 다음을 사용했습니다.

rename 's/\.zip$/\.cbz/' *.zip

오류 없이 명령이 완료되었지만 파일의 2/3 정도가 누락된 것을 발견했습니다. 이것은 대괄호나 따옴표가 포함된 일부 파일의 이름과 관련이 있는 것으로 생각되지만 누락된 파일 중 일부는 매우 간단한 이름( comic5.zip)을 가지고 있다는 것을 알고 있으며 이름이 대괄호로 시작하는 모든 파일이 이제 누락되었음을 발견했습니다.

photorec을 사용하여 이 파일을 복구하려고 시도했지만 그 중 하나를 찾을 수 없습니다.

지금은 폴더 크기가 훨씬 작아져서 삭제된 것으로 보이지만 만약 그렇다면 photorec에서는 적어도 일부는 복구할 수 있지 않을까 생각합니다 . 내 파일 탐색기만 사용하면 폴더는 명령을 실행하기 전 약 120GB, 실행 후 약 40GB였습니다. 아쉽게도 명령 이전에는 실제 파일 수를 볼 수 없었지만 스크롤을 통해 파일 수가 훨씬 적다는 것도 알 수 있었습니다.

이 파일에 무슨 일이 일어났는지, 복구할 수 있는지 아는 사람이 있나요?

$ rename -V
/usr/bin/rename using File::Rename version 1.30, File::Rename::Options version 1.10

고쳐 쓰다:

알고 보니 photorec의 일부 이전 설정을 변경하는 것을 잊어버렸습니다. 다시 실행하여 누락된 파일을 찾았으며 이제 모든 파일이 복원된 것이 확실합니다. 나는 이것이 파일이 실제로 삭제되었음을 확인한다고 생각합니다. 아직도 어떻게 된 일인지는 확실하지 않지만 스티븐의 설명이 가장 가능성이 높다고 생각합니다.

어쨌든, 도와주셔서 감사합니다.

답변1

실행하는 명령을 고려하십시오.

rename 's/\.zip$/\.cbz/' *.zip

이는 glob 패턴과 일치하는 현재 디렉터리의 모든 파일 또는 디렉터리 이름 마지막 4자를 에서 로 변경합니다. 그게 다야. Perl 대체 표현식을 사용하여 이름 바꾸기를 수행합니다.*.zip.zip.cbz

또한 적어도 내 시스템에서는 rename대상 이름이 이미 존재하는 프로젝트(파일)의 이름을 바꾸는 것이 거부됩니다.

touch a.zip a.zap
rename 's/\.zip$/.zap/' *.zip
a.zip not renamed: a.zap already exists

파일의 약 2/3가 누락된 것을 발견했습니다.

당신이 설명하는 상황에서는 파일(또는 디렉토리 등)이 사라지는 합리적인 + 상황이 보이지 않습니다 . mv예를 들어 덮어쓰기 전에 온전성 검사를 수행하지 않는 다른 명령이 있을 수도 있습니다 . 당신의 것을 확인 history하고 그것이 무엇을 보여주는지 확인하십시오


* 실제로는 일반 파일, 디렉토리, 장치, 파이프 등 모든 유형의 항목 이름을 변경합니다. 하지만 제가 설명한 조건을 충족하는 경우에만 가능합니다.

+ 대시( -)나 이중 대시( --)로 시작하는 파일은 항상 문제가 됩니다. 별도의 분리된 명령 인수와 파일 인수를 사용하거나 일반 형식 대신 --수정된 형식을 사용하여 파일 모드를 보호하지 않는 한 여기서도 마찬가지입니다 . 예를 들어 이름 을 ../namenamemv -- -a dasha-adash

답변2

$ touch {comic5,{a..d}}.zip './--e=BEGIN{unlink for <c*>}#.zip'
$ ls
 a.zip   b.zip   comic5.zip   c.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'
$ rename 's/\.zip$/\.cbz/' *.zip
$ ls
 a.zip   b.zip   d.zip  '--e=BEGIN{unlink for <c*>}#.zip'

이런! 이름이 로 시작하는 모든 파일이 c삭제되었습니다.

File::Rename구현을 위해 rename이러한 질문은 다음과 같습니다.1.99로 고정(내 요청에 따라) 하지만 Ubuntu 22.04에는 버전 1.30이 함께 제공됩니다.

여기서 당신은 다음을 원할 것입니다:

rename 's/\.zip\z/\.cbz/' ./*.zip

./접두어를 사용하면 zip 파일 이름을 옵션으로 사용할 수 없습니다 rename.

또는 특정 구현의 경우 rename인수 대신 표준 입력을 통해 파일 목록을 전달합니다.

printf '%s\0' *.zip | rename -0 's/\.zip/\.cbz/'

쉘과 함께 printf내장된 기능(대부분)도 다음과 함께 작동합니다.Argument list too long한계.

또는 그런 문제가 없고 몇 가지 추가 보호 장치가 있으며 일반적으로 사용하기 더 쉬운 zsh's를 대신 사용하십시오²:zmv

autoload -Uz zmv
zmv '(*).zip' '$1.cbz'

이제는 이것이 우연히 일어난 것 같지 않습니다. 이런 일이 발생하면 누군가가 해당 명령을 실행할 것임을 알고 현재 디렉터리에 유사한 이름을 가진 악성 파일을 심을 수 있습니다.

악성코드가 존재 unlink()하거나 rename()교체로 인해 파일이 삭제된 경우 다음을 사용할 수 있습니다.일부 파일 시스템 삭제 취소/복원 방법. shred/ 와 동일한 작업을 수행하거나 wipe랜섬웨어와 같이 파일을 다른 곳으로 이동하기 전에 콘텐츠를 암호화하는 경우 가장 좋은 옵션은 백업에서 복원하는 것입니다.

악성 파일 이름이 없으면 rename이름을 바꾸기 전에 대상 파일이 존재하는지 확인하므로 일반적으로 데이터 손실이 없습니다. 이러한 기호 링크의 대상에 액세스할 수 없으면 기호 링크 파일이 손실될 수 있습니다.rename사용-e <the-target>유틸리티처럼 확인할 수 없는 심볼릭 링크에 대해 -efalse를 반환합니다 [.

$ touch a.zip
$ ln -s /x a.bcz
$ ls -n
total 4
lrwxrwxrwx 1 1000 1000 2 Dec 22 08:39 a.bcz -> /x
-rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.zip
$ rename -v 's/\.zip$/\.bcz/' *.zip
a.zip renamed as a.bcz
$ ls -n
total 0
-rw-r--r-- 1 1000 1000 0 Dec 22 08:39 a.bcz

이런! (깨진) a.bcz심볼릭 링크가 사라졌습니다.

그러나 심볼릭 링크는 디스크에서 아주 작은 공간을 차지하므로 이는 현재 겪고 있는 120GiB 손실의 80%를 설명하지 못합니다.

Chris처럼 나도 당신의 문제가 다른 곳에 있다고 생각합니다. 귀하의 파일이 여전히 거기에 있을 수도 있지만, 귀하가 생각하는 디렉토리에는 없을 수도 있습니다. 시도 해봐sudo find / -iname 'comic5.zip' -o -iname 'comic5.cbz'


¹ 또한 일반적으로 정규 \z표현식 $에서 in을 사용하여 다음을 제외한 모든 항목과 일치시키길 원한다는 점에 유의하세요.철사$주제의 끝(여기서 원하는 것) 또는 주제 끝의 개행 이전(원하지 않지만 이 특별한 경우 주제는 개행이 .zip아닌 개행 으로 끝나므로)과 일치 합니다 . 그건 문제가 되지 않을 거예요).

mv² 각 파일마다 하나씩 호출하기 때문에 일반적으로 속도가 느립니다 . zmodload zsh/files내장 된 mv.

관련 정보