「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.
これがあなたに必要なものであることを願っています。