mirror of
https://github.com/natelandau/shell-scripting-templates.git
synced 2025-11-10 22:13:48 -05:00
add internal unique number to _uniqueFilename_
This commit is contained in:
@@ -356,6 +356,21 @@ _testParseYAML_() {
|
||||
assert_output "hello world"
|
||||
}
|
||||
|
||||
@test "_uniqueFileName_: no extension" {
|
||||
touch "test"
|
||||
|
||||
run _uniqueFileName_ "test"
|
||||
assert_output --regexp ".*/test\.1$"
|
||||
}
|
||||
|
||||
@test "_uniqueFileName_: no extension - internal integer" {
|
||||
touch "test"
|
||||
touch "test.1"
|
||||
|
||||
run _uniqueFileName_ -i "test"
|
||||
assert_output --regexp ".*/test\.2$"
|
||||
}
|
||||
|
||||
@test "_uniqueFileName_: Count to 3" {
|
||||
touch "test.txt"
|
||||
touch "test.txt.1"
|
||||
@@ -365,6 +380,15 @@ _testParseYAML_() {
|
||||
assert_output --regexp ".*/test\.txt\.3$"
|
||||
}
|
||||
|
||||
@test "_uniqueFileName_: internal integer" {
|
||||
touch "test.txt"
|
||||
touch "test.1.txt"
|
||||
touch "test.2.txt"
|
||||
|
||||
run _uniqueFileName_ -i "test.txt"
|
||||
assert_output --regexp ".*/test\.3\.txt$"
|
||||
}
|
||||
|
||||
@test "_uniqueFileName_: Don't confuse existing numbers" {
|
||||
touch "test-2.txt"
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
|
||||
_listFiles_() {
|
||||
# DESC: Find files in a directory. Use either glob or regex
|
||||
# ARGS: $1 (Required) - 'g|glob' or 'r|regex'
|
||||
@@ -45,7 +46,8 @@ _backupFile_() {
|
||||
# ARGS: $1 (Required) - Source file
|
||||
# $2 (Optional) - Destination dir name used only with -d flag (defaults to ./backup)
|
||||
# OPTS: -d - Move files to a backup direcory
|
||||
# -m - Replaces copy (default) with move, effectively removing the
|
||||
# -m - Replaces copy (default) with move, effectively removing
|
||||
# the original file
|
||||
# OUTS: None
|
||||
# USAGE: _backupFile_ "sourcefile.txt" "some/backup/dir"
|
||||
# NOTE: dotfiles have their leading '.' removed in their backup
|
||||
@@ -53,15 +55,15 @@ _backupFile_() {
|
||||
local opt
|
||||
local OPTIND=1
|
||||
local useDirectory=false
|
||||
local moveFile=false
|
||||
local MOVE_FILE=false
|
||||
|
||||
while getopts ":dDmM" opt; do
|
||||
case ${opt} in
|
||||
d | D) useDirectory=true ;;
|
||||
m | M) moveFile=true ;;
|
||||
m | M) MOVE_FILE=true ;;
|
||||
*)
|
||||
{
|
||||
error "Unrecognized option '$1' passed to _makeSymlink_" "${LINENO}"
|
||||
error "Unrecognized option '${1}' passed to _backupFile_" "${LINENO}"
|
||||
return 1
|
||||
}
|
||||
;;
|
||||
@@ -71,7 +73,7 @@ _backupFile_() {
|
||||
|
||||
[[ $# -lt 1 ]] && fatal 'Missing required argument to _backupFile_()!'
|
||||
|
||||
local s="${1}"
|
||||
local SOURCE_FILE="${1}"
|
||||
local d="${2:-backup}"
|
||||
local n # New filename (created by _uniqueFilename_)
|
||||
|
||||
@@ -86,9 +88,9 @@ _backupFile_() {
|
||||
warning "need function _uniqueFileName_"
|
||||
return 1
|
||||
}
|
||||
[ ! -e "$s" ] \
|
||||
[ ! -e "${SOURCE_FILE}" ] \
|
||||
&& {
|
||||
warning "Source '${s}' not found"
|
||||
warning "Source '${SOURCE_FILE}' not found"
|
||||
return 1
|
||||
}
|
||||
|
||||
@@ -97,21 +99,20 @@ _backupFile_() {
|
||||
[ ! -d "${d}" ] \
|
||||
&& _execute_ "mkdir -p \"${d}\"" "Creating backup directory"
|
||||
|
||||
if [ -e "$s" ]; then
|
||||
n="$(basename "${s}")"
|
||||
n="$(_uniqueFileName_ "${d}/${s#.}")"
|
||||
if [ ${moveFile} == true ]; then
|
||||
_execute_ "mv \"${s}\" \"${d}/${n##*/}\"" "Moving: '${s}' to '${d}/${n##*/}'"
|
||||
if [ -e "${SOURCE_FILE}" ]; then
|
||||
n="$(_uniqueFileName_ "${d}/${SOURCE_FILE#.}")"
|
||||
if [ ${MOVE_FILE} == true ]; then
|
||||
_execute_ "mv \"${SOURCE_FILE}\" \"${d}/${n##*/}\"" "Moving: '${SOURCE_FILE}' to '${d}/${n##*/}'"
|
||||
else
|
||||
_execute_ "cp -R \"${s}\" \"${d}/${n##*/}\"" "Backing up: '${s}' to '${d}/${n##*/}'"
|
||||
_execute_ "cp -R \"${SOURCE_FILE}\" \"${d}/${n##*/}\"" "Backing up: '${SOURCE_FILE}' to '${d}/${n##*/}'"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
n="$(_uniqueFileName_ "${s}.bak")"
|
||||
if [ ${moveFile} == true ]; then
|
||||
_execute_ "mv \"${s}\" \"${n}\"" "Moving '${s}' to '${n}'"
|
||||
n="$(_uniqueFileName_ "${SOURCE_FILE}.bak")"
|
||||
if [ ${MOVE_FILE} == true ]; then
|
||||
_execute_ "mv \"${SOURCE_FILE}\" \"${n}\"" "Moving '${SOURCE_FILE}' to '${n}'"
|
||||
else
|
||||
_execute_ "cp -R \"${s}\" \"${n}\"" "Backing up '${s}' to '${n}'"
|
||||
_execute_ "cp -R \"${SOURCE_FILE}\" \"${n}\"" "Backing up '${SOURCE_FILE}' to '${n}'"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -520,19 +521,37 @@ _sourceFile_() {
|
||||
}
|
||||
|
||||
_uniqueFileName_() {
|
||||
# DESC: Ensure a file to be created has a unique filename to avoid overwriting other files
|
||||
# DESC: Ensure a file to be created has a unique filename to avoid overwriting other
|
||||
# filenames by appending an integer to the filename if it already exists.
|
||||
# ARGS: $1 (Required) - Name of file to be created
|
||||
# $2 (Optional) - Separation characted (Defaults to a period '.')
|
||||
# OUTS: Prints unique filename to STDOUT
|
||||
# OPTS: -i - Places the unique integer before the file extension
|
||||
# USAGE: _uniqueFileName_ "/some/dir/file.txt" "-"
|
||||
|
||||
local opt
|
||||
local OPTIND=1
|
||||
local INTERNAL_INTEGER=false
|
||||
while getopts ":iI" opt; do
|
||||
case ${opt} in
|
||||
i | I) INTERNAL_INTEGER=true ;;
|
||||
*)
|
||||
{
|
||||
error "Unrecognized option '${1}' passed to _uniqueFileName_" "${LINENO}"
|
||||
return 1
|
||||
}
|
||||
;;
|
||||
esac
|
||||
done
|
||||
shift $((OPTIND - 1))
|
||||
|
||||
local fullfile="${1:?_uniqueFileName_ needs a file}"
|
||||
local spacer="${2:-.}"
|
||||
local directory
|
||||
local filename
|
||||
local extension
|
||||
local newfile
|
||||
local n
|
||||
local num
|
||||
|
||||
if ! command -v realpath >/dev/null 2>&1; then
|
||||
error "We must have 'realpath' installed and available in \$PATH to run."
|
||||
@@ -552,19 +571,29 @@ _uniqueFileName_() {
|
||||
filename="$(basename "${fullfile}")"
|
||||
|
||||
# Extract extensions only when they exist
|
||||
if [[ ${filename} =~ \.[a-zA-Z]{2,4}$ ]]; then
|
||||
if [[ "${filename}" =~ \.[a-zA-Z]{2,4}$ ]]; then
|
||||
extension=".${filename##*.}"
|
||||
filename="${filename%.*}"
|
||||
fi
|
||||
if [[ "${filename}" == "${extension}" ]]; then
|
||||
extension=""
|
||||
fi
|
||||
|
||||
newfile="${directory}/${filename}${extension:-}"
|
||||
|
||||
if [ -e "${newfile}" ]; then
|
||||
n=1
|
||||
while [[ -e "${directory}/${filename}${extension:-}${spacer}${n}" ]]; do
|
||||
((n++))
|
||||
num=1
|
||||
if [ "${INTERNAL_INTEGER}" = true ]; then
|
||||
while [[ -e "${directory}/${filename}${spacer}${num}${extension:-}" ]]; do
|
||||
((num++))
|
||||
done
|
||||
newfile="${directory}/${filename}${extension:-}${spacer}${n}"
|
||||
newfile="${directory}/${filename}${spacer}${num}${extension:-}"
|
||||
else
|
||||
while [[ -e "${directory}/${filename}${extension:-}${spacer}${num}" ]]; do
|
||||
((num++))
|
||||
done
|
||||
newfile="${directory}/${filename}${extension:-}${spacer}${num}"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "${newfile}"
|
||||
|
||||
Reference in New Issue
Block a user