как удалить строку в нескольких именах файлов после определенного символа?

a )Установите setroubleshoot.x86_64для графического интерфейса пользователя; это может быть проще, чем использование tail.

# yum install setroubleshoot.x86_64 setroubleshoot-plugins.noarch

Добавление политик SE Linux дляmongodb(и возможных других )может снизить нагрузку.

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

b )Возможна переустановка setroubleshootd:

yum reinstall setroubleshoot-server
-1
10.04.2020, 14:14
3 ответа
for file in *; do
    ext=.${file##*.}                #Gets file extension
    [ "$ext" = ".$file" ] && ext="" #If file had no extension, set it to empty string
    nostr=${file%%-*}               #Remove everything after -
    mv "$file" "$nostr$ext"
done
0
28.04.2021, 23:18

Вы можете использовать подстановку параметров bash следующим образом:

for i in *; do
  # ${i%%-*} get everything before the first '-' (use ${i%-*} for the last '-')
  # ${i/.*} remove everything after the '.'
  # ${i##${i%.*}} remove everything except everything after the last '.'
  mv "${i}" "${i%%-*}${i##${i%.*}}"
done
-1
28.04.2021, 23:18

Использование цикла вbash:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name/-*./.}"
done

Это переименовывает каждый файл .mp4и файл .srtпутем замены части имени между первым дефисом и последней точкой на точку посредством подстановки переменных.

Я специально выбрал файлы .mp4и .srt, поскольку именно их вы указали в вопросе.

Использование переносной петли sh:

for name in *.mp4 *.srt; do
    mv -i -- "$name" "${name%%-*}.${name##*.}"
done

Здесь ${name%%-*}будет исходным именем, в котором все после первого дефиса будет обрезано, а ${name##*.}будет суффиксом имени файла после последней точки в имени файла.


Использование утилиты Perl rename:

$ tree
.
|-- 01. file one-sdvanv-12lknl.mp4
|-- 01. file one-sdvanv-12lknl.srt
|-- 02. file two-afdsmakl-asdfafdaf.mp4
|-- 02. file two-afdsmakl-asdfafdaf.srt
|-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.mp4
`-- 03. file three-adfadaasd-asdfadfafad-adad1d1das.srt

0 directory, 6 files
$ rename 's/-.*\././' -- *.mp4 *.srt
$ tree
.
|-- 01. file one.mp4
|-- 01. file one.srt
|-- 02. file two.mp4
|-- 02. file two.srt
|-- 03. file three.mp4
`-- 03. file three.srt

0 directory, 6 files

Perl-выражение s/-.*\././представляет собой замену, которая будет применяться к каждому заданному имени файла, переименовывая файл.

Эта замена заменяет часть имени файла от первого дефиса до последней точки на точку.

Вы можете добавить -nк вызову утилиты rename, чтобы сначала увидеть, что произойдет.

См. также:

-1
28.04.2021, 23:18

Теги

Похожие вопросы