2015-07-06 3 views
3

У меня есть список файлов в моем каталоге:Пакетная удалить подстроку из файла со специальными символами в BASH

opencv_calib3d.so2410.so 
opencv_contrib.so2410.so 
opencv_core.so2410.so 
opencv_features2d.so2410.so 
opencv_flann.so2410.so 
opencv_highgui.so2410.so 
opencv_imgproc.so2410.so 
opencv_legacy.so2410.so 
opencv_ml.so2410.so 
opencv_objdetect.so2410.so 
opencv_ocl.so2410.so 
opencv_photo.so2410.so 

Они продукт из серии ошибок, сделанных с пакетной переименовывает, и теперь я могу» t выяснить, как удалить средний «.so» из каждого из них. Например:

opencv_ocl.so2410.so должен быть opencv_ocl2410.so

Это то, что я пробовал:

# attempt 1, replace the (first) occurrence of `.so` from the filename 
for f in opencv_*; do mv "$f" "${f#.so}"; done 

# attempt 2, escape the dot 
for f in opencv_*; do mv "$f" "${f#\.so}"; done 

# attempt 3, try to make the substring a string 
for f in opencv_*; do mv "$f" "${f#'.so'}"; done 

# attempt 4, combine 2 and 3 
for f in opencv_*; do mv "$f" "${f#'\.so'}"; done 

Но все из них не имеют никакого эффекта, производя сообщения об ошибках:

mv: ‘opencv_calib3d.so2410.so’ and ‘opencv_calib3d.so2410.so’ are the same file 
mv: ‘opencv_contrib.so2410.so’ and ‘opencv_contrib.so2410.so’ are the same file 
mv: ‘opencv_core.so2410.so’ and ‘opencv_core.so2410.so’ are the same file 
... 

ответ

3

Попробуйте это в вашей команде mv:

mv "$f" "${f/.so/}" 

Первое совпадение .so заменяется пустой строкой.

+3

Отлично. Намного проще. –

3
a='opencv_calib3d.so2410.so' 
echo "${a%%.so*}${a#*.so}" 
opencv_calib3d2410.so 

Где:

  • ${a%%.so*} - часть перед тем первый .so
  • ${a#*.so} - часть после первый .so
+0

Работал! Готово. Спасибо. Моя доброта делает языки ракушек, когда-либо издевающихся над мной ... – kdbanman

+0

@kdbanman, если на ваш вопрос ответили, вы должны пометить его как таковой. –

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