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"

おすすめ記事