2009-09-30 3 views
17

У меня есть много файлов, которые имеют общий шаблон в их имени, который я хотел бы удалить. Например, у меня есть файлы «a_file000.tga» и «another_file000.tga». Я хотел бы сделать операцию над этими файлами, которая удалит шаблон «000» из их имен, в результате чего появятся новые имена «a_file.tga» и «another_file.tga».Как удалить конкретные символы из имен файлов с помощью BASH

ответ

30

Попробуйте это (это работает в обычном старом Bourne sh а):

for i in *000.tga 
do 
    mv "$i" "`echo $i | sed 's/000//'`" 
done 

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

+0

+1 для большинства портативных решений (и потому, что я слишком низко на upvotes, чтобы сохранить upvoting _all_ хорошие ответы). –

33

Bash может сделать sed -как замены:

for file in *; do mv "${file}" "${file/000/}"; done 
+0

прекрасно работает на OS X (10.6.8). Удобный и лаконичный. Благодарю. – jamesnotjim

+0

Ницца, можете ли вы объяснить функцию "{"? – efrem

+0

@efrem: фигурные скобки являются необязательным разделителем для имен переменных и необходимы для разложения параметров. Дополнительную информацию см. В [Bash Manual] (https://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion). –

8

Не-Баш решение, так как я знаю две быстрых плакатов уже покрыл, что:

Там отличная короткую перл программа под названием rename, который устанавливается по умолчанию в некоторых системах (другие менее полезные программы переименования) , Это позволяет использовать PERL регулярное выражение для переименования, например:

rename 's/000//' *000*.tga 
4
#!/bin/bash 
ls | while read name; do 
    echo mv $name ${name/$1//} 
done 
+1

+1: Мне нравится '| в то время как read' construct. – Cascabel

+3

Как «ls | while read name» лучше, чем «для имени в *»? –

+0

@Laurence Gonsalves: использование командной строки оболочки расширяет командную строку, и там есть не так большой предел. «во время чтения» избегает этого – Javier

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