web-dev-qa-db-ja.com

bashスクリプトでファイルをコピーし、コピー中にファイル名を変更して同じディレクトリに配置する方法

ファイル「file.doc」をコピーし、「file_copy.doc」にコピーするときに名前を変更して、同じディレクトリに配置するにはどうすればよいですか?

そして、これはスクリプトを呼び出し、引数にファイル名を追加するだけです。

bash launch_copyer file.doc
7
redaction

ここでは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はそれらの1つであるので、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"
4

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.
2
#!/bin/bash
ss=0
for file do
    cp -fp -- "$file" "${file%.*}_copy.${file##*.}" || ss=$?
done
exit $ss

fileにドット拡張部分がない場合、これは失敗します。動作させるためにそれが必要な場合は、 StéphaneChazelasのソリューション を使用してください。

1
roaima
cp /example/directory/file.doc /example/directory/file_copy.doc

これはファイル名を指定し、あなたが望むことをします

0
user115967

これを試して:

#!/bin/bash
if [ -f "$1" ];
then
  cp -v "$1" _"$1"
  rename -v 's/_(.+?)\./$1_copy\./' _"$1"
fi

スクリプトは、入力として受け取る入力ファイルが存在するかどうかを確認します。その場合、ファイルの一時的なコピーを作成し、そのコピーの名前を変更して、名前の最初のドットを文字列_copy.に置き換えます。

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

0