在基本目录中我有这样的文件夹:
1
2
3
4
5
10
110
所以在每个文件中我都有类似的文件
0010011.mp3 0010031.mp3 0010051.mp3 0010071.mp3 0010021.mp3 0010041.mp3 0010061.mp3
所以我想删除前 3 个字符和最后 1 个字符,这样文件将如下所示
001.mp3 003.mp3 005.mp3 007.mp3 002.mp3 004.mp3 006.mp3
我试过这个
for file in ??????*; do echo mv $file `echo $file | cut -c4-`; done
这也不适用于子目录,只是文件位于基本目录中
答案1
我不建议只收集所有与 *.mp3 匹配的文件,然后修剪文件名。您可能想稍后再次运行相同的脚本(例如下周),并且它不应该尝试再次重命名相同的文件,从而使它们变得更短并且存在命名冲突。
您的示例文件名似乎是001xyz1.mp3你想要xyz.mp3
KEEP_DIR=$PWD
cd /your/music/base_dir # sub-dirs holding .mp3
RCOUNT=0 ; SKIP=0 ; FCC=0
for FFF in */001???1.mp3
do
LOC="$(dirname $FFF)"
BAS="$(basename $FFF)"
TRIM1="${BAS#1.mp3}" #could use ${BAS:4:3}
NEWF="$LOC/${TRIM1%001}.mp3"
if [ -e "$NEWF" ] ; then
echo "#-- File $NEWF already exists, not renaming $FFF"
SKIP=$((SKIP+1))
else
mv $FFF $NEWF
MCOUNT=$((MCOUNT+1))
fi
FCC=$((FCC+1))
done
echo "Renamed $MCOUNT mp3 files, of $FCC found. (Skipped $SKIP)"
cd $KEEP_DIR
#--[eof]
答案2
如果您有rename
(有时称为prename
),您可以通过一个命令执行此操作:
rename -n 's!(.*/)...(.*).(\.mp3)!$1$2$3!' */?????*.mp3
或者,您可以循环遍历文件:
for f in */?????*.mp3
do
echo mv -v "$f" "$(echo "$f" | sed -r 's!(.*/)...(.*).(\.mp3)!\1\2\3!')"
done
在第一个实例中,删除-n
(或替换为-v
)以使其执行工作。在第二个实例中,删除第一个实例echo
以允许其应用更改。
答案3
您可以使用7 个字符长的基本名称为每个 mp3sed
创建一个命令行:mv
$ find . -name "???????.mp3" | sed 's/\(.*\)\(...\)\(...\)\(.\)\(\.mp3\)/mv \1\2\3\4\5 \1\3\5/'
查看输出后,您可以将其重定向到文件中并执行。