mv: 대상이 존재하는 경우 파일 이름에 숫자를 추가합니다.

mv: 대상이 존재하는 경우 파일 이름에 숫자를 추가합니다.

파일을 다른 폴더로 이동하고 있으며 동일한 이름의 파일이 이미 존재하는 경우 새로 이동한 파일에 일종의 색인을 추가하고 싶습니다(이전 파일은 변경되지 않은 상태로 유지되어야 함). 예를 들어, file.pdf나는 같은 이름을 가진 다음 파일이 존재하는 file1.pdf경우 를 선호합니다.file_1.pdf

여기반대 아이디어의 변형을 찾았지만 "백업"을 만들고 싶지 않습니다.

mv이 시나리오에 대해 기본적으로 제공되는 매개변수가 있습니까 ? 저는 우분투 리눅스를 사용합니다.

답변1

연결한 질문에 대한 답변에서 이미 지적했듯이 mv이동한 파일로 덮어쓰게 될 파일에 접미사를 추가하고 숫자를 사용하여 고유한 파일 이름을 지정할 수 있습니다.

mv --backup=t <source_file> <dest_file>

이 명령은 사용되지 않은 다음 숫자 접미사를 대상 디렉터리의 첫 번째 파일에 추가하여 작동합니다. 이동 중인 파일은 원래 이름을 유지합니다.

.~1~그러나 이것은 당신이 원하는 것이 아닌 것 같은 접미사를 추가합니다 .

$ ls
file.pdf
file.pdf.~1~
file.pdf.~2~

두 번째 단계에서 이러한 파일의 이름을 바꾸어 file_1.pdf대체 형식으로 이름을 얻을 수 있습니다 file.pdf.~1~. 예를 들면 다음과 같습니다.

rename 's/((?:\..+)?)\.~(\d+)~$/_$2$1/' *.~*~

이렇게 하면 원치 않는 백업 접미사로 끝나는 모든 파일을 가져오고(쉘 glob 일치를 통해 *.~*~) 도구가 파일 이름의 정규식 rename과 일치하도록 시도 합니다. ((?:\..+)?)\.~(\d+)~$일치하는 항목이 있으면 접미사 유사 색인을 .~1~두 번째 그룹( $2)으로 캡처하고 선택적으로 파일 이름의 해당 접미사 앞에 확장자가 있는 경우(예: ) 첫 번째 그룹( )에서 캡처합니다 .pdf. $1그런 다음 전체 일치하는 파일 이름 부분을 바꾸고 _$2$1자리 표시자 대신 캡처된 값을 삽입합니다.

file.pdf.~1~기본적으로 이름은 to file_1.pdfsomething.~42~to 로 변경되지만 something_42파일에 확장자가 여러 개 있는지 감지할 수 없습니다 archive.tar.gz.~5~.archive.tar_5.gz

답변2

내가 겪고 있는 문제는 BASH 스크립트가 작업 중에 동일한 이름을 가진 파일을 만나거나 덮어쓴다는 것입니다 mv.

해결책 mv --backup=t <src> <dest>도 여기에 있습니다https://serverfault.com/questions/267255/mv-rename-if-exists좋은 결과. 하지만 파일 확장자를 유지하고 싶습니다.

여기에 해결책이 있습니다.

[victoria@victoria out]$ ls -l

total 20
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 apple1.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 apple2.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 apple3.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 apple4.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 apple5.txt

[victoria@victoria out]$ for f in *; do mv -f --backup=t "$f" banana.txt; done

[victoria@victoria out]$ ls -l
total 20
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt.~1~
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt.~2~
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt.~3~
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt.~4~

[victoria@victoria out]$ for f in *; do mv 2>/dev/null -v "$f" "`echo $f | sed -r 's/(.*)\.(.*)\.~([0-9]{1,})~$/\1_\3.\2/'`"; done

renamed 'banana.txt.~1~' -> 'banana_1.txt'
renamed 'banana.txt.~2~' -> 'banana_2.txt'
renamed 'banana.txt.~3~' -> 'banana_3.txt'
renamed 'banana.txt.~4~' -> 'banana_4.txt'

[victoria@victoria out]$ ls -l

total 20
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana_1.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana_2.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana_3.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana_4.txt
-rw-r--r-- 1 victoria victoria 6 May 23 18:13 banana.txt

[victoria@victoria out]$ 

설명하다:

  • 정규식 명령을 사용하여 sed소스 파일 이름의 세 부분을 캡처합니다.

/(.*)\.(.*)\.~([0-9]{1,})~$/

즉, 시퀀스 일치에서는 다음과 같습니다.

  • 모든 것:(.*) # captured as group \1
  • 기간\.
  • 모든 것:(.*) # captured as group \2
  • 기간\.
  • 틸데:~
  • 숫자의 개수:([0-9]{1,}) # captured as group \3
  • 두 번째 물결표 및 줄 끝:~$

재정렬합니다.

/\1_\3.\2/ # 마침표의 위치를 ​​주의하세요. 여기서 벗어날 필요는 없습니다`

`-quoted 명령의 시작/끝 부분에 백틱을 사용하는 것에 유의하세요 ."echo

2>/dev/null잘못된 경고가 발생하면 무시하세요.

-v명령이 자세한 정보를 출력하지 않도록 하려면 이 플래그를 생략하십시오 mv.


또한보십시오:

답변3

글쎄, 내 배쉬 기술이 그리 나쁘지 않다고 판단하지 마세요. 하지만 이 솔루션은 저에게 효과적이었습니다. (감사합니다바이트 커맨더 솔루션그러나 이것은 한계 때문이며 내가 원하는 것은 아닙니다)

그래서 여기에 작업을 수행하는 작은 스크립트가 있습니다 ...

  • $2경로입니다
  • $3파일 이름
  • $punktpdf그냥 ".pdf"

여기 내 작은 스크립트가 있습니다 ...

if [ -s $2$3$punktpdf ]; then
    for i in `seq 1 100000`;
        do
            if [ ! -s $2$3$i$punktpdf ]; then
                if mv scan.pdf $2$3$i$punktpdf; then                        
                    echo $3$i$punktpdf
                    exit 0
                    break
               else                        
                    echo 1
                    break
               fi
           fi
        done
    else
        #Regular mv
    fi

답변4

move명령을 만들었습니다 . move파일이 존재하는 경우 명령은 색인을 추가합니다.

npm i -g @gauravnumber/move

폴더 구조

.
├── 1.txt
├── 2.txt
├── 3.txt
├── 4.txt
├── 5.txt
└── 6.txt

다음 명령을 입력하십시오.

move 1.txt 2.txt

2.txt존재하는 파일입니다. move이 명령은 파일에 색인을 추가합니다. 위의 명령을 실행한 후. 폴더 구조는 아래와 같습니다.

.
├── 2_1.txt
├── 2.txt
├── 3.txt
├── 4.txt
├── 5.txt
└── 6.txt

move이 명령은 여러 파일도 지원합니다.

move *.jpg dirname
move *.png *.jpg dirname
move dirname1 dirname2
move dirname1/* dirname2

이것은에 대한 링크입니다환매 계약

관련 정보