Переименовать несколько файлов с 2 условиями/заменами в одной строке?

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]
8
27.07.2018, 23:03
4 ответа

Возможно, вам нужно использовать команду 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
$
10
27.01.2020, 20:09

Использование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файлы в текущем каталоге и переименовывает их в одно и то же имя, при этом все символы верхнего регистра преобразуются в символы нижнего регистра.

2
27.01.2020, 20:09

Чтобы ответить на ваш вопрос в общем,

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, чтобы выполнить переименование ).

6
27.01.2020, 20:09

Самый простой способ, основанный на справочной странице , который не охватываетрегулярное выражение:

rename 'IMG' 'img' * ; rename 'JPG' 'jpg' *
1
27.01.2020, 20:09

Теги

Похожие вопросы