The following script can
be used to upload local files and folders to the Azure storage account from an
on-premises machine using the AzCopy utility which is a command line tool that
can be used to copy blobs or files to or from a storage account, and then
transfer data. The tool requires authentication but allows unattended login via
a security principal. It also resumes a previous execution of the copy
command with help of journaling. A custom location for the journal folder can
be specified via the –resume option. Azure Data Lake Gen2 storage works with
only the latest versions of the AzCopy such as v10 onwards. For multi-region
deployments, it is recommended to have the data landing in one region and then
replicated globally using AzCopy.
#!/bin/sh
throw() {
echo "$*"
>&2
exit 1
}
STORAGE_ACCOUNT_NAME=
CONTAINER_NAME=
LOCAL_FOLDER_PATH=
usage() {
echo
echo "Usage:
$(basename $0) -b arg -c arg -l arg [-h]"
echo
echo "-b - The
name of the blob storage account."
echo "-c - The
name of the container."
echo "-l - The
name of the local system folder."
echo "-h -
This help text."
echo
}
parse_options() {
while getopts ':b:l:c:h'
opt; do
case
"$opt" in
b)
STORAGE_ACCOUNT_NAME="$OPTARG"
;;
l)
LOCAL_FOLDER_PATH="$OPTARG"
;;
c)
CONTAINER_NAME="$OPTARG"
;;
h)
echo
"Processing option 'h'"
usage
exit
0
;;
:)
echo
"option requires an argument.\n"
usage
exit
1
;;
?)
echo
"Invalid command option.\n"
usage
exit
1
;;
esac
done
shift "$(($OPTIND
-1))"
}
parse_options
"$@"
if ([ -z
"$LOCAL_FOLDER_PATH" ] || [ -z "$STORAGE_ACCOUNT_NAME" ] ||
[ -z "$CONTAINER_NAME" ]);
then
echo "Invalid
command.\n"
usage
exit 1
fi
./azcopy login
./azcopy copy
"$LOCAL_FOLDER_PATH"
"https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/$CONTAINER_NAME"
--recursive=true
./azcopy sync
"$LOCAL_FOLDER_PATH"
"https://$STORAGE_ACCOUNT_NAME.blob.core.windows.net/$CONTAINER_NAME"
--recursive=true
# crontab -e
# */5 * * * * sh
/path/to/upload.sh
The script can be made to
run periodically so that the delta changes can also be propagated.
#codingexercise
Problem Statement:
A 0-indexed integer
array nums is given.
Swaps of adjacent elements
are able to be performed on nums.
A valid array meets the following
conditions:
· The largest element (any
of the largest elements if there are multiple) is at the rightmost position in
the array.
· The smallest element
(any of the smallest elements if there are multiple) is at the leftmost
position in the array.
Return the minimum swaps required to make nums a
valid array.
Example 1:
Input: nums = [3,4,5,5,3,1]
Output: 6
Explanation: Perform the
following swaps:
- Swap 1: Swap the 3rd and 4th elements, nums is
then [3,4,5,3,5,1].
- Swap 2: Swap the 4th and 5th elements, nums is
then [3,4,5,3,1,5].
- Swap 3: Swap the 3rd and 4th elements, nums is
then [3,4,5,1,3,5].
- Swap 4: Swap the 2nd and 3rd elements, nums is
then [3,4,1,5,3,5].
- Swap 5: Swap the 1st and 2nd elements, nums is
then [3,1,4,5,3,5].
- Swap 6: Swap the 0th and 1st elements, nums is
then [1,3,4,5,3,5].
It can be shown that 6
swaps is the minimum swaps required to make a valid array.
Example 2:
Input: nums = [9]
Output: 0
Explanation: The array is already
valid, so we return 0.
Constraints:
· 1 <= nums.length
<= 105
· 1 <= nums[i] <= 105
Solution:
class Solution {
public int minimumSwaps(int[] nums) {
int min = Arrays.stream(nums).min().getAsInt();
int max = Arrays.stream(nums).max().getAsInt();
int count = 0;
while (nums[0] != min && nums[nums.length-1] != max && count
< 2 * nums.length)
{
var numsList = Arrays.stream(nums).boxed().collect(Collectors.toList());
var end = numsList.lastIndexOf(max);
for (int i = end; i < nums.length-1; i++) {
swap(nums, i, i+1);
count++;
}
numsList
= Arrays.stream(nums).boxed().collect(Collectors.toList());
var start = numsList.indexOf(min);
for (int j = start; j
>= 1; j--) {
swap(nums, j, j-1);
count++;
}
}
return count;
}
public void swap (int[] nums, int i, int j) {
int temp = nums[j];
nums[j]
= nums[i];
nums[i]
= temp;
}
}
Input
nums =
[3,4,5,5,3,1]
Output
6
Expected
6
Input
nums =
[9]
Output
0
Expected
0
No comments:
Post a Comment