如何复制文件“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"
(假设文件和目录名称不以换行符结尾)。
(当然,这也适用于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.
我希望这是你所需要的。