ITYM:
Array=(11 22 33 44 55)
Array[0]=${Array[3]} # "3", not "$3"
В результате получилось бы:
Array=(44 22 33 44 55)
3 доллара США
расширяется до третьего позиционного аргумента (аргумента сценария оболочки), если он пуст (как обычно в интерактивной оболочке), то $ {array [$ 3]}
совпадает с $ {array [0]}
или $ array
.
Если вы хотите достичь:
Array=(55 11 22 33 44)
, вам нужно будет сделать:
Array=("${Array[4]}" "${Array[@]:0:4}")
Или в более общем плане:
Array=("${Array[@]: -1}" "${Array[@]:0:${#Array[@]}-1}")
С помощью zsh
вы также можете сделать:
Array[1,0]=$Array[-1] # insert the last element at the beginning
Array[-1]=() # remove the last element
или:
Array=("$Array[-1]" "${(@)Array[1,-2]}")
С yash
:
array -i Array 0 "${Array[-1]}"
array -d Array -1
С fish
(при условии, что массив имеет как минимум 2 элемента):
set Array 11 22 33 44 55
set Array $Array[-1 1..-2]
Возможно, вам нужно использовать команду perl rename. В моем окне CentOS это называется «предварительное имя».
$ ls
IMG_1.JPG IMG_2.JPG IMG_3.JPG
$ prename 's/^IMG/img/;s/\.JPG$/\.jpg/' *JPG
$ ls
img_1.jpg img_2.jpg img_3.jpg
$
$ prename -h
Usage: prename [OPTION]... PERLEXPR FILE...
Rename FILE(s) using PERLEXPR on each filename.
-b, --backup make backup before removal
-B, --prefix=SUFFIX set backup filename prefix
-f, --force remove existing destinations, never prompt
-i, --interactive prompt before overwrite
-l, --link-only link file instead of reame
-n, --just-print, --dry-run don't rename, implies --verbose
-v, --verbose explain what is being done
-V, --version-control=METHOD override the usual version control
-Y, --basename-prefix=PREFIX set backup filename basename prefix
-z, -S, --suffix=SUFFIX set backup filename suffix
--help display this help and exit
--version output version information and exit
The backup suffix is ~, unless set with SIMPLE_BACKUP_SUFFIX. The
version control may be set with VERSION_CONTROL, values are:
numbered, t make numbered backups
existing, nil numbered if numbered backups exist, simple otherwise
simple, never always make simple backups
Report bugs to pederst@cpan.org
$
Если вы хотите использовать тупую команду rename
из util-linux
(, иногда называемую rename.ul
), возможно, вам нужно выполнить ее в два этапа, например:.
$ ls
IMG_1.JPG IMG_2.JPG IMG_3.JPG
$ rename IMG img *JPG
$ rename JPG jpg *JPG
$ ls
img_1.jpg img_2.jpg img_3.jpg
$
Использованиеmv
:
ш совместимый:
for file in *.JPG; do mv "$file" "$(echo "$file" | tr '[:upper:]' '[:lower:]')"; done
Баш (Спасибо steeldriver):
for file in *.JPG; do mv "$file" "${file,,}"; done
Это циклически перебирает все .JPG
файлы в текущем каталоге и переименовывает их в одно и то же имя, при этом все символы верхнего регистра преобразуются в символы нижнего регистра.
Чтобы ответить на ваш вопрос в общем,
rename multiple files with 2 conditions/replacements in one line?
вы обычно используете группы захвата , ссылаясь на них в выражении замены, используя их соответствующие обратные ссылки . Например
$ rename -n 's/^(.*)_(.*)\.JPG$/\L$1_$2.jpg/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)
Однако в данном конкретном случае было бы проще просто применить модификатор нижнего регистра \L
ко всему имени:
$ rename -n 's/.*/\L$&/' *.JPG
rename(IMG_2.JPG, img_2.jpg)
rename(IMG_3.JPG, img_3.jpg)
Другая альтернатива, использующаяmmv
$ mmv -n '*.JPG' '#l1.jpg'
IMG_2.JPG -> img_2.jpg
IMG_3.JPG -> img_3.jpg
(удалите -n
, чтобы выполнить переименование ).
Самый простой способ, основанный на справочной странице , который не охватываетрегулярное выражение:
rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *