Переименовать соответствующие файлы на основе серийного номера - PullRequest
0 голосов
/ 12 ноября 2018

Предположим, у меня есть куча файлов, которые являются скриншотами для Mac:

Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png

И я хочу использовать mv, чтобы пометить их:

Screen_0.png
Screen_1.png
Screen_2.png

Частичная команда, которую я придумаю:

find . -name "Screen*" -exec sh -c 'mv "$1" "Screen_$2"' _ {} ??? \;

Как реализовать команду, чтобы она могла маркировать изображение цифрами? или мне нужно прибегнуть к более сложному файлу.

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Вы можете просто использовать rename, a.k.a. Переименование Perl:

rename --dry-run 's/.*/Screen_$N.png/' Screenshot*png

Пример вывода

'Screenshot 2018-11-12 at 11.54.32.png' would be renamed to 'Screen_1.png'
'Screenshot 2018-11-12 at 11.54.38.png' would be renamed to 'Screen_2.png'
'Screenshot 2018-11-12 at 11.54.42.png' would be renamed to 'Screen_3.png'

Если вам нравится внешний вид вывода, запустите снова без --dry-run.


Если вы работаете в macOS, вы можете установить Perl rename с homebrew :

brew install rename
0 голосов
/ 12 ноября 2018

Если вы используете массив, арифметика не требуется, просто используйте индекс каждого элемента:

#!/bin/bash
files=('Screen Shot'*.png)
for i in "${!files[@]}" ; do
    mv "${files[i]}" Screen_$i.png
done
0 голосов
/ 12 ноября 2018

С Perl one liner вы также можете легко это сделать.

> ls -1 Screen*
Screen Shot 2018-11-09 at 12.37.37 PM.png
Screen Shot 2018-11-10 at 4.53.02 PM.png
Screen Shot 2018-11-10 at 9.19.19 PM.png
> perl -ne ' BEGIN { for(glob("Screen*")) {  rename "$_", "Screen_".$x++.".png" } ; exit }'
> ls -1 Screen*
Screen_0.png
Screen_1.png
Screen_2.png
>
0 голосов
/ 12 ноября 2018

Я не думаю, что можно передать порядковый номер xargs так, как вы хотите. Вместо этого используйте простой цикл:

#!/bin/bash
for file in Screen*.png; do
  [[ -f $file ]] || continue # skip if not a regular file
  mv "$file" "Screen_$((count++)).png"
done
...