여러 파일을 반복하면서 $file
현재 파일을 표시하고 있습니다.
현재 파일을 복사하거나 이름을 바꾸고 확장자를 동일하게 유지하려면 어떻게 해야 합니까?
예를 들어 $file
=x.jpg
$file
파일 이름을 사용하여 복사본을 만드는 방법x_orig.jpg
지금까지 나는 다음을 가지고 있습니다 :
for file in /tmp/p/DSC*.JPG; do
cp $file $file+'_orig'.JPG
done
하지만 이것은 파일을 복사합니다
DSCF1748.JPG
도착하다
DSCF1748.JPG+_orig.JPG
그리고 나는 이름을 원해요
DSCF1748_orig.JPG
마찬가지로,cp $file "$file"_orig.JPG
결과 파일은 다음과 같습니다DSCF1748.JPG_orig.JPG
_orig
파일 이름의 중간 부분을 얻고 싶습니다 ...
답변1
배쉬를 사용할 수 있습니다문자열 교체 기능그 이유는 다음과 같습니다.
for file in /tmp/p/DSC*.JPG; do
cp "$file" "${file%.JPG}"_orig.JPG
done
일반적인 형식은 끝부터 삭제하는 것입니다 ${string%substring}
. 예를 들어:substring
string
$ f=foobar.JPG; echo "${f%.JPG}"
foobar
답변2
zcp -o -p '/tmp/p/DSC*.JPG' '$f:r_orig.JPG'
또는 동등하게
zcp -o -p '/tmp/p/(DSC*).JPG' '/tmp/p/${1}_orig.JPG'
이를 위해서는 zsh를 실행하고(다른 쉘에는 그런 기능이 없음) 이것을 다음 위치에 넣어야 합니다 ~/.zshrc
.
autoload -U zmv
alias zcp='zmv -C'
alias zln='zmv -L'
-o -p
파일 메타데이터(특히 수정 시간)를 보존하기 위해 명령 에 zcp
옵션이 전달되도록 지시합니다 .-p
cp