如何在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"

(假设文件和目录名称不以换行符结尾)。

(当然,这也适用于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.

我希望这是你所需要的。

相关内容