파일을 다른 폴더로 이동하고 있으며 동일한 이름의 파일이 이미 존재하는 경우 새로 이동한 파일에 일종의 색인을 추가하고 싶습니다(이전 파일은 변경되지 않은 상태로 유지되어야 함). 예를 들어, 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.pdf
및 something.~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
.
또한보십시오:
https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html
https://www.regular-expressions.info/refcapture.html
추가 지침, 정규식 구문 예제, 정규식 캡처 그룹 및 역참조
https://stackoverflow.com/questions/55643041/how-do-i-rename-files-found-with-the-find-command
명령을 사용하여
find
파일 이름을 바꾸는 데 사용됩니다.
답변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
이것은에 대한 링크입니다환매 계약