Как удалить текст из имени папки после определенного слова

Требуется помощь при попытке написать скрипт / команду, которая будет очищать текст в каталоге после определенного слова, в этом примере загрузки. Мысль об использовании оператора for i, но не повезло.

Пример

Song Band - загрузка названия песни 9038450985934853434

Загрузка списка музыки dkjge3j6lk45j45756567

Загрузка видеокарты 4k645jel43k5yk574yryryrrtryry очистил бы слово download и все остальное справа, чтобы он выглядел следующим образом

Song Band - Название песни

Music List

Видеокарта

1
задан 13 June 2020 в 00:42

1 ответ

Вот код, который вам нужен, и некоторые тестовые данные, которые вам не нужны:

#!/bin/bash

# NAME: truncate-dname
# PATH: $HOME/askubuntu/
# DESC: Answer for: https://askubuntu.com/questions/1249771/how-to-remove-text-from-a-folder-name-after-a-certain-word/1249785#1249785
# DATE: June 12, 2020

echo ==============  CREATE TEST DATA  ==================
mkdir -p dnames
cd dnames
mkdir -p "Song Band - Song Name download 9038450985934853434"
mkdir -p "Music List download dkjge3j6lk45j45756567"
mkdir -p "Video Chart download 4k645jel43k5yk574yryryrrtyryrryryrt"
ls

echo ==============  RENAME DIRECTORIES  ================
for old_name in ./*
do
    new_name="${old_name% download*}"
    mv -v "$old_name" "$new_name"
done

echo ==============  DELETE TEST DATA  ==================
ls
cd ..
rm -rf dnames

Когда вы запускаете скрипт, вы получаем это:

$ truncate-dname
============== CREATE TEST DATA ==================
Music List download dkjge3j6lk45j45756567
Song Band - Song Name download 9038450985934853434
Video Chart download 4k645jel43k5yk574yryryrrtyryrryryrt
============== RENAME DIRECTORIES ================
'./Music List download dkjge3j6lk45j45756567' -> './Music List'
'./Song Band - Song Name download 9038450985934853434' -> './Song Band - Song Name'
'./Video Chart download 4k645jel43k5yk574yryryrrtyryrryryrt' -> './Video Chart'
============== DELETE TEST DATA ==================
Music List  Song Band - Song Name  Video Chart

Ключевая операция, которую вы хотите, - извлечь подстроку внутри строки перед строкой поиска. Например:

$ a="Song Band - Song Name download 9038450985934853434"

$ b="${a% download*}"

$ echo $b
Song Band - Song Name

Этот процесс немного сложен, если в названии песни появляется слово «скачать», поэтому оно встречается в имени файла дважды:

$ c="People keep downloading my songs download 9038465489643541"

$ d="${c%% download*}"

$ echo $d
People keep

$ d="${c% download*}"

$ echo $d
People keep downloading my songs

Если у вас есть два %% , оно удаляет все после первое появление "загрузки", которое вы не хотите. Так что в этом случае вы хотите просто использовать один % , поэтому последняя «загрузка» является точкой отсечения.

Существует также операция # , которая ищет в противоположной Направление, которое вам определенно не нужно:

$ c="People keep downloading my songs download 9038465489643541"

$ e="${c##* download}"

$ echo $e
9038465489643541

$ e="${c#* download}"

$ echo $e
ing my songs download 9038465489643541

Вот подробное описание .

1
ответ дан 19 June 2020 в 21:25

Другие вопросы по тегам:

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