Không cần bash
ở đây, bất kỳ sh
triển khai thông dịch viên tiêu chuẩn sẽ làm:
#! /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"
(giả sử tên tệp và thư mục không kết thúc bằng ký tự dòng mới).
(tất nhiên, điều đó cũng sẽ làm việc với bash
vì bash
là một trong những thông dịch viên tiêu chuẩnsh
.)
Đối với một bash
giải pháp cụ thể, bạn có thể thử:
#! /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"