"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.
이것이 당신에게 필요한 것이기를 바랍니다.