2013-11-29 11 views
1

У меня есть много файлов (в одном каталоге), как:Баш - массовые переименования файлов с большим количеством специальных символов

[a]File-. abc'.d -001[xxx].txt 

так что есть много пробелов, апострофов, скобки, и полные остановки. Единственные различия между ними - цифры вместо 001, а буквы вместо xxx. Как удалить среднюю часть, так что все, что осталось бы

[a]File-001[xxx].txt 

Я хотел бы объяснить, как такой код будет работать, так что я мог бы адаптировать его для других целей, и мы надеемся, поможет ответить на подобные вопросы другим.

ответ

2

Вот простой скрипт в чистом bash:

for f in *; do   # for all entries in the current directory 
    if [ -f "$f" ]; then # if the entry is a regular file (i.e. not a directory) 
    mv "$f" "${f/-*-/-}" # rename it by removing everything between two dashes 
          # and the dashes, and replace the removed part 
          # with a single dash 
    fi 
done 

Магия сделано в выражении "${f/-*-/-}" описана в руководстве Баш (команда info bash) в главе 3.5.3 Shell Параметр расширения

Шаблон * в первой строке скрипта можно заменить чем угодно, чем может помочь сузить список наполнителей, которые вы хотите переименовать, например *.txt, *File*.txt и т. Д.

+0

Да, его работы! Сначала я получил «1.sh: 3: 1.sh: Bad substitution», но затем отредактировал скрипт, чтобы исключить файл, в котором он находится. (* .txt), и он сработал. Я также немного сыграл с редактированием, чтобы убедиться, что я получу, как это работает. Спасибо, Раджиш. – user3049646

+0

Не благодарите меня, просто отметьте его как принятый ответ;) – Rajish

1

Если у вас есть (ака prename) утилита rename это часть распределения Perl, вы могли бы сказать:

rename -n 's/([^-]*-).*-(.*)/$1$2/' *.txt 

переименовать все текстовые файлы в нужный формат. -n выше было бы не выполнить фактическое переименование, только сообщите, что бы вы сделали, если бы вы его не указали. (Для выполнения фактического переименования, удаления -n из приведенной выше команды.)

Например, это будет переименовать файл

[a]File-. abc'.d -001[xxx].txt 

в

[a]File-001[xxx].txt 

Что касается объяснения , это фиксирует часть до первого - в группу, а часть после второго (или последнего) - в другую и объединяет их.

Подробнее о Regular Expressions. Если у вас есть perl docs, доступные в вашей системе, вам следует помочь perldoc perlre.

Смежные вопросы