2014-10-03 2 views
1

У меня есть 100 файлов в каталоге со следующим соглашением об именах.переименовать несколько файлов при сохранении того же расширения в linux

00XYZCD042ABCDE20141002ABCDE.XML 
00XYZCC011ABCDE20141002.TXT 
00XYZCB165ABCDE20141002ABCDE.TXT 
00XYZCB165ABCDE20141002ABCDE.CSV 

Я хочу переименовать эти файлы с помощью bash, awk, cut, sed , так что я получить выход

XYZCD042.XML 
XYZCC011.TXT 
XYZCB165.TXT 
XYZCB165.CSV 

поэтому в основном удалить первые 2 0s всегда, а затем сохранить все, пока не начнется ABCDE и затем удалите все, включая ABCDE, и сохраните расширение файла.

Пожалуйста, помогите большое спасибо

ответ

2
for i in *; do 
    mv $i $(echo $i | sed -e 's/^00//' -e 's/ABCDE2014[^.]*//'); 
done 
6

Bash только:

for fn in *; do 
    A=${fn#00} 
    mv $fn ${A/ABCDE*./.} 
done 

Первая строка в цикл раздевает префикс 00, а вторая линия полосы суффикс ABCDE (с точностью до точка), затем выполняет переименование.

+0

+1, просто указывая, что он также работает для zsh и ksh и, вероятно, некоторых других, о которых я не могу думать. – terdon

+0

Это будет ответ «rockin», если вы добавите объяснение. – dawg

+0

@ dawg: ОК, сделал это. – nneonneo

6

Вы можете попробовать ниже rename команды

rename 's/ABCDE.*(\..*)/$1/;s/^00//' * 

Объяснение:

  • s/ABCDE.*(\..*)/$1/ Матчи все символы от первого ABCDE Шифрование до последнего и фиксирует только расширенную часть. Затем все совпадающие символы заменяются этим захваченным расширением.
  • s/^00// Тогда это приведет к удалению ведущих двух нулей.
4
for file in * 
do 
    mv -- "$file" "${file:2:8}.${file#*.}" 
done 

Это важно всегда цитирую ваши переменные, если у вас нет конкретной цели в виду и понять все эффекты.

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