Если имя файла содержит более n символов, удалите последние

Я вроде как новичок в unix shell, и я не могу найти ответ на мою проблему :

У меня есть папка, содержащая несколько файлов: правильное имя файла содержит ровно 13 символов (цифры + буквы + подчеркивание). Например :

1305359000_PS.JPG

Некоторые файлы названы неправильно, ошибка всегда в последних символах, например:

9009015000_PS_1.jpg

Мне нужно запустить команду find / replace, которая будет работать так для всех файлов в моей папке :

ЕСЛИ имя файла > 13 символов (без расширения), то удалите все символы после 13-го.

Я попробовал несколько команд с mmv и awk, но пока застрял.

Edit : забыл уточнить, команда должна учитывать пробел(ы) в имени файла и удалять их, если они присутствуют.

0
17.03.2016, 12:32
2 ответа

Возможно, есть и другое наиболее быстрое решение. Этот код не учитывает наличие пробела в имени файла. Но вы можете попробовать следующий код:

SHW@SHW:/tmp # for i in `find /home/user -type f`
do
      mv $i `echo $i | cut -c -13`.`$i | rev | cut -d'.' -f 1 | rev`
done
0
28.01.2020, 02:35

Предполагая, что вы используете оболочку bash

(shopt -s globstar; rename --no-act 's/^(.{13}).*/$1\.jpg/' **/*)

(....) означает, что параметр shopt -s globstar применим только к этому одна команда - если по какой-то причине подстановка уже не включена. При использовании zsh

rename --no-act 's/^(.{13}).*/$1\.jpg/' **/*

переключатель - no-act даст предварительный просмотр того, что переименовать ] потенциально подойдет.
Если вас устраивают предлагаемые изменения, удалите -no-act , и ваши файлы будут массово переименованы.

2
28.01.2020, 02:35

Теги

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