Показать статистику
0 голосов
от (2.3тыс. баллов)
У меня имеется папка, содержащая большое количество файлов. Мне хочется переименовать их автоматически, используя для этой цели терминал или сценарий оболочки следующим образом: «prefix_number.extension».

Чтобы вышло что-то вроде такого: cin_1.jpg, cin_2.png и так далее
186 просмотров 1 ответов

1 Ответ

0 голосов
от (26.4тыс. баллов)

Попробуйте сделать следующее:

count=0; for f in *; do [ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"; done

Или, если вы предпочитаете, чтобы ваши команды распределялись по нескольким строкам:

count=0
for f in *
do
[ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"
done

Как это работает

count=0

Этот вывод инициализирует переменную count в ноль.

for f in *; do

Это будет запускать цикл по всем файлам в текущем каталоге.

[ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"

[ -f "$f" ] 

проверяет, является ли файл $ f обычным файлом (не каталогом).

Если $f это обычный файл, то выполняется команда move ( mv).  -i говорит mv не перезаписывать существующие файлы без запроса.

 "cin_$((++count)).${f##*.}" 

это имя нового файла. 

 cin_ 

это префикс.  

$((++count))

возвращает значение count после того, как оно было увеличено.  

${f##*.}

это расширение файла $f.

done

Отмечает конец цикла.

Например

Имеется каталог с этими тремя файлами:

$ ls
alpha.jpg  beta.png  gamma.txt

Запустим  эту команду:

$ count=0; for f in *; do [ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"; done

После ее запуска файлы в каталоге теперь:

$ ls
cin_1.jpg  cin_2.png  cin_3.txt
...