我有嵌套在文件夹中的文件。如果文件名以重复两次的字符串开头,我想将文件名更改为一个名称,使该字符串只出现一次。
例如:
- 重命名"脏投影仪-脏投影仪-搜索生命.mp3"到"肮脏的投影仪-搜索生活.mp3">
- 将"Eefje de Visser-Eefje de Visser-Bitterzoet.mp3"重命名为"Eefye de Visser-Bitterzoet.mp3">
- 保持"冯-也许下次.mp3"的原样
如何在Linux中使用命令行执行此操作?
我组合了@Barmar的regex和@U880D的shell脚本,以递归方式删除文件名中的任何重复前缀。使用find
和perl-rename
时出现问题,所以我不得不这样做:
#!/bin/bash
shopt -s globstar;
for DIR in ${PWD}/**/; do
cd "${DIR}"
for FILENAME in *.mp3 ; do
NEWFILENAME=$(echo "${FILENAME}" | perl -pe 's/^(.*)1/1/')
if [ "${FILENAME}" != "${NEWFILENAME}" ] ; then
mv "${FILENAME}" "${NEWFILENAME}"
fi
done
done
如何在Linux中使用命令行实现这一点
经过一些研究,它似乎有点复杂。因此,它可能最终会出现在脚本中。
renameMusic.sh
#!/bin/bash
DIRECTORY=$1
cd ${DIRECTORY}
echo "Normalize filenames in $(pwd)"
for FILENAME in *; do
echo
echo "Checking file ${FILENAME}"
# Count number of dash (-)
NUMBER=$(grep -o '-' <<< ${FILENAME} | wc -l)
echo "Found ${NUMBER} of dash (-)"
# Check if the artist name seems to be there twice
if [[ "${NUMBER}" -eq 2 ]]; then
# If so, remove the double part
NEWFILENAME=$(echo "${FILENAME}" | cut -d "-" -f 2- | sed -e 's/^[[:space:]]*//')
echo "Going to move to new name ${NEWFILENAME}"
# mv ${FILENAME} ${NEWFILENAME}
fi
done
感谢
- 通过
ls
循环导致Bash-shell脚本 - 如何循环查找返回的文件名
- 使用
grep
计数出现的总数 - Bash中的数字比较
- 如何从Bash变量中修剪空白
rename
和mv
有什么区别- 何时将引号括在shell变量周围