我在重命名文件夹中的一堆文件时遇到了一点问题。脚本:
for file in $1
do
mv $file $file | sed -r 's/^.{20}//' | sed 's/.\{16\}$//'
done
输出:
mv: cannot move `/home/timothy/Videos/DB/' to a subdirectory of itself, `/home/timothy/Videos/DB/DB'
SED命令是正确的,只是我对mv参数做错了。
以下是前 5 个文件的名称:
[a-s]_dragon_ball_-_001_-_the_secret_of_the_dragon_balls__rs2_[4FC1375C]
[a-s]_dragon_ball_-_002_-_the_emperors_quest__rs2_[59F9C743]
[a-s]_dragon_ball_-_003_-_the_nimbus_cloud_of_roshi__rs2_[0C592F5F]
[a-s]_dragon_ball_-_004_-_oolong_the_terrible__rs2_[47CE4923]
[a-s]_dragon_ball_-_005_-_yamcha_the_desert_bandit__rs2_[B6A035BF]
它应该变成这样:
001_-_the_secret_of_the_dragon_balls
002_-_the_emperors_quest
003_-_the_nimbus_cloud_of_roshi
004_-_oolong_the_terrible
005_-_yamcha_the_desert_bandit
答案1
我假设你有这样的文件,
[a-s]_dragon_ball_-_001_-_the_secret_of_the_dragon_balls__rs2_[4FC1375C]
[a-s]_dragon_ball_-_002_-_the_emperors_quest__rs2_[59F9C743]
[a-s]_dragon_ball_-_003_-_the_nimbus_cloud_of_roshi__rs2_[0C592F5F]
[a-s]_dragon_ball_-_004_-_oolong_the_terrible__rs2_[47CE4923]
[a-s]_dragon_ball_-_005_-_yamcha_the_desert_bandit__rs2_[B6A035BF]
这些文件以 [as] 开头。并且您希望将它们重命名为,(根据您的评论)
001_-_the_secret_of_the_dragon_balls
002_-_the_emperors_quest
003_-_the_nimbus_cloud_of_roshi
004_-_oolong_the_terrible
005_-_yamcha_the_desert_bandit
使用下面这个脚本,
#!/bin/bash
for file in [\[a\-s\]]*
do
newfile=`echo "$file" | sed -r "s/^.{20}//" | awk -F "__rs2" '{print $1}'`
mv $file $newfile
done
它是如何工作的
此脚本扫描当前目录中所有以“[as]”开头的文件名。接下来,在 for 循环中,对于每个扫描到的文件名,脚本都会创建新的文件名,过滤掉前 20 个字符,sed
并删除以字符串“__rs2”开头的部分。这样可以删除名称中不需要的部分。最后,将文件逐个重命名为新文件名。
用法
将代码另存为rename_file.sh
.(例如)接下来将其放在所有这些文件所在的同一目录中。授予脚本执行权限。在终端中写入,
chmod +x rename_file.sh
最后要重命名文件,只需在终端中写入,
./rename_file.sh
完毕。
答案2
看看这是否适合你
#! /bin/bash
for file in "$1"
do
target_name=$(echo "$file" | sed -r 's/^.{20}//' | sed 's/.\{16\}$//')
mv "$file" "$target_name"
done