ファイル「file.doc」をコピーし、「file_copy.doc」にコピーするときに名前を変更して、同じディレクトリに配置するにはどうすればよいですか?
そして、これはスクリプトを呼び出し、引数にファイル名を追加するだけです。
bash launch_copyer file.doc
ここでは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"
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.
#!/bin/bash
ss=0
for file do
cp -fp -- "$file" "${file%.*}_copy.${file##*.}" || ss=$?
done
exit $ss
file
にドット拡張部分がない場合、これは失敗します。動作させるためにそれが必要な場合は、 StéphaneChazelasのソリューション を使用してください。
cp /example/directory/file.doc /example/directory/file_copy.doc
これはファイル名を指定し、あなたが望むことをします
これを試して:
#!/bin/bash
if [ -f "$1" ];
then
cp -v "$1" _"$1"
rename -v 's/_(.+?)\./$1_copy\./' _"$1"
fi
スクリプトは、入力として受け取る入力ファイルが存在するかどうかを確認します。その場合、ファイルの一時的なコピーを作成し、そのコピーの名前を変更して、名前の最初のドットを文字列_copy.
に置き換えます。
私はそれがあなたが必要としたものであることを願っています。