Bash 스크립트에서 파일을 복사하고 복사하는 동안 이름을 바꾸고 동일한 디렉토리에 넣는 방법

Bash 스크립트에서 파일을 복사하고 복사하는 동안 이름을 바꾸고 동일한 디렉토리에 넣는 방법

"file.doc" 파일을 어떻게 복사하고 "file_copy.doc"에 복사할 때 이름을 바꾸고 같은 디렉터리에 넣을 수 있나요?

이는 스크립트를 호출하고 매개변수에 파일 이름을 추가해야만 달성할 수 있습니다.

bash launch_copyer file.doc

답변1

여기서는 이것이 필요하지 않습니다 bash. 표준 sh인터프리터 구현은 다음을 수행합니다.

#! /bin/sh -
ret=0
for file do
  dir=$(dirname -- "$file")
  case $dir in
    (*[!/]*) dir=$dir/ # handle / and // specially
  esac
  base=$(basename -- "$file")
  name=${base%.*}
  name=${name:-$base} # don't consider .bashrc the extension in /foo/.bashrc
  ext=${base#"$name"}
  new_file=$dir${name}_copy$ext
  cp -- "$file" "$new_file" || ret=$?
done
exit "$ret"

(파일 및 디렉토리 이름이 개행 문자로 끝나지 않는다고 가정).

(물론 이는 1인칭 bash시점 이후에도 마찬가지다.bash표준 sh통역사.)

특정 솔루션 의 경우 bash다음을 시도해 볼 수 있습니다.

#! /bin/bash -
ret=0
re='^((.*/)?[^/])(([^/]*)(\.))?([^/]*)/*$'
for file do
  if [[ $file =~ $re ]]; then
    if [[ ${BASH_REMATCH[5]} ]]; then
      suffix=_copy.${BASH_REMATCH[6]}
    else
      suffix=${BASH_REMATCH[6]}_copy
    fi
    cp -- "$file" "${BASH_REMATCH[1]}${BASH_REMATCH[4]}$suffix" || ret=$?
  else
    printf >&2 '%s\n' "$0: Error: refusing to copy $file"
    ret=1
 fi
done
exit "$ret"

답변2

OP는 bash 솔루션을 찾고 있기 때문입니다. 이것은 할 수 있는 일입니다.

#!/bin/bash

if [[ ! -f $1 && $(($# != 1)) ]]; then 
    printf '%s\n' "Provide a filename"
    exit 1
fi

inFile="$1"
fileExt="${1#*.}"
destFile="${1%.*}"

cp -- "$inFile" "${destFile}_copy.$fileExt"  # As suggested, so the files that start with a dash are not ignored.

답변3

#!/bin/bash
ss=0
for file do
    cp -fp -- "$file" "${file%.*}_copy.${file##*.}" || ss=$?
done
exit $ss

file포인트 확장이 없으면 실패합니다. 업무상 필요하신 경우 사용하세요Stéphane Chazelas의 솔루션.

답변4

이 시도:

#!/bin/bash
if [ -f "$1" ];
then
  cp -v "$1" _"$1"
  rename -v 's/_(.+?)\./$1_copy\./' _"$1"
fi

이 스크립트는 입력으로 받은 입력 파일이 존재하는지 확인합니다. 이 경우 파일의 임시 복사본을 만든 다음 해당 복사본의 이름을 바꾸고 이름의 첫 번째 점을 문자열로 바꿉니다._copy.

이것이 당신에게 필요한 것이기를 바랍니다.

관련 정보