2016-12-19 20 views
2

У меня есть 4 файлов для переименования:Использование регулярных выражений в Баш с мв

./01: 
I0010001 I0020001 

./02: 
I0010001 I0020001 

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

$ mv \(*/*\) \1.dcm 
mv: cannot stat '(*/*)': No such file or directory 

$ mv \(./*/*\) \1.dcm 
mv: cannot stat '(./*/*)': No such file or directory 

$ mv \(./\*/\*\) \1.dcm 
mv: cannot stat '(./*/*)': No such file or directory 

$ mv "\(./*/*\)" "\1.dcm" 
mv: cannot stat '\(./*/*\)': No such file or directory 

$ mv 0\([1-2]\)/I00\([1-2\)]0001 0\1/I00\20001.dcm 
mv: cannot stat '0([1-2])/I00([1-2)]0001': No such file or directory 

$ mv "0\([1-2]\)/I00\([1-2\)]0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)/I00\([1-2\)]0001': No such file or directory 

$ mv "0\([1-2]\)/I00\([1-2]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)/I00\([1-2]\)0001': No such file or directory 

$ mv "0\([[:digit:]]\)/I00\([[:digit:]]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([[:digit:]]\)/I00\([[:digit:]]\)0001': No such file or directory 

$ mv "0\([1-2]\)\/I00\([1-2]\)0001" "0\1/I00\20001.dcm" 
mv: cannot stat '0\([1-2]\)\/I00\([1-2]\)0001': No such file or directory 

$ mv \(*\) \1.dcm 
mv: cannot stat '(*)': No such file or directory 

Ни один из них дайте результат, который я хочу.

+0

Итак, вы знаете: ваша проблема здесь в том, что это не регулярные выражения: звезда в bash использует [globbing] (https://linux.die.net/man/7/glob). Особое отличие здесь состоит в том, что нет групп захвата: скобки считаются буквами. – Chris

ответ

3

Вам не нужно здесь регулярные выражения, это очень просто с for цикла:

for f in 0[12]/I00[12]0001 ; do mv "$f" "${f}.dcm" ; done 

Для более сложных ситуациях, вы должны смотреть в программу rename (prename на некоторых системах), который использует мощные регулярные выражения Perl для обработки переименования. Хотя здесь излишне, это простой случай использовать:

pax> rename -n 's/$/.dcm/' 0[12]/I00[12]0001 
rename(I01/I0010001, I01/I0010001.dcm) 
rename(I01/I0020001, I01/I0020001.dcm) 
rename(I02/I0010001, I02/I0010001.dcm) 
rename(I02/I0020001, I02/I0020001.dcm) 

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