无法将文件移动到其自身的子目录中

无法将文件移动到其自身的子目录中

我在重命名文件夹中的一堆文件时遇到了一点问题。脚本:

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

相关内容