あなたは、ファイルがファイルを扱うことができる柔軟なソリューションを提供するために移動する前に存在している場合、単純にチェックするよりも、もう少し気を取らなければなりません拡張機能の有無にかかわらず。ソート順を保持する重複したファイル名を作成する方法を提供することもできます。例えばfile.txt
が既に存在する場合、10
になると、file1.txt
ではなく、target
ではfile_001.txt
を重複して使用することができます。ファイル名で正規の並べ替えができなくなります。
また、落とし穴で加工されたfor i in $(ls dir)
で繰り返すことは決してありません。あなたは次のような何かをすると、あなただけ移動するfilename.ext
または/path/to/drop/filename.ext
を指定することができ、合理的な柔軟なソリューションを持っている可能性があり、Bash Pitfalls No. 1
が一緒にそれらの作品を置くと、以下のコメントで詳細を含めて参照してください。状況に応じて、スクリプトにdrop
とtarget
のディレクトリを指定する必要があります。
#!/bin/bash
tgt=target ## set target and drop directories as required
drp=drop
declare -i cnt=1 ## counter for filename_$cnt
test -z "$1" && { ## validate one argument given
printf "error: insufficient input\nusage: %s filename\n" "${0##*/}"
exit 1
}
test -w "$1" || test -w "$drp/$1" || { ## validate valid filename is writeable
printf "error: file not found or lack permission to move '%s'.\n" "$1"
exit 1
}
fn="${1##*/}" ## strip any path info from filename
if test "$1" != "${1%.*}" ; then
ext="${fn##*.}" ## get file extension
fnwoe="${fn%."$ext"}" ## get filename without extension
test "$fnwoe" = '' && ext= ## was a dotfile, reset ext
fi
vfn="$fn" ## set valid filename = filename
## form valid filename e.g. "$fn_001.$ext" if duplicate found
while test -e "$tgt/$vfn"; do
if test -n "$ext" ## did we have have an extension?
then
printf -v vfn "%s_%03d.%s" "$fnwoe" "$((cnt++))" "$ext"
else
printf -v vfn "%s_%03d" "$fn" "$((cnt++))"
fi
done
mv "$drp/$fn" "$tgt/$vfn" ## move file under non-conflicting name
例降下と標的
$ ls -1 drop
file
file.txt
$ ls -1 target
file.txt
file_001.txt
file_002.txt
使用例
$ bash mvdrop.sh file
$ bash mvdrop.sh drop/file.txt
たドロップと標的
$ ls -1 drop
$ ls -1 target
file
file.txt
file_001.txt
file_002.txt
file_003.txt
あなたが言ったことは確かですか?重複したファイル名がある場合はそのファイルを探し、ドロップ先のフォルダにファイル名を変更してから、目的のディレクトリに移動してください。重複**?あなたは** name **または** exist **の中に重複を意味します。より正確な例を追加 –