如何删除文件夹名称中某个单词后面的文本

如何删除文件夹名称中某个单词后面的文本

需要帮助尝试编写一个脚本/命令,用于清除目录中某个单词后面的文本,在此示例中为下载。考虑过使用 for i 语句,但没有成功。

例子

歌曲乐队 - 歌曲名称下载 9038450985934853434

音乐列表下载 dkjge3j6lk45j45756567

视频图表下载 4k645jel43k5yk574yryryrrtyryrryryrt

尝试让它清除下载一词,并将右侧的所有其他内容清除为如下所示

歌曲乐队 - 歌曲名称

音乐列表

视频图表

答案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

这里有一个详尽的参考

相关内容