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.

これがあなたに必要なものであることを願っています。

関連情報