在shell中重命名文件
我的文件夹和文件结构如下在shell中重命名文件,shell,rename,Shell,Rename,我的文件夹和文件结构如下 Folder/1/fileNameOne.ext Folder/2/fileNameTwo.ext Folder/3/fileNameThree.ext ... 如何重命名文件以使输出变为 Folder/1_fileNameOne.ext Folder/2_fileNameTwo.ext Folder/3_fileNameThree.ext ... 在linux shell中如何实现这一点?如果名称始终相同,即“文件”,则这可能会起作用: 如果数字范围中有更多的
Folder/1/fileNameOne.ext
Folder/2/fileNameTwo.ext
Folder/3/fileNameThree.ext
...
如何重命名文件以使输出变为
Folder/1_fileNameOne.ext
Folder/2_fileNameTwo.ext
Folder/3_fileNameThree.ext
...
在linux shell中如何实现这一点?如果名称始终相同,即“文件”,则这可能会起作用: 如果数字范围中有更多的dir,请将
{1..3}
更改为{x..y}
我使用<代码> ${i}文件而不是<代码> $Iyfile ,因为它会考虑<代码> $Iyfile < /Cord>一个变量>代码> Iyfile ,而我们只想<代码> i <代码> >变量>代码>文件> />代码>文本。 如果名称总是相同的话,这可能起作用,即“文件”: 如果数字范围中有更多的dir,请将
{1..3}
更改为{x..y}
我使用<代码> ${i}文件而不是<代码> $Iyfile < /Cord>,因为它会考虑<代码> $Ix文件< /C> >变量>代码> Ix文件< /C> >,而我们只想<代码> i>代码>文件> <代码>,并附加文本。 您想做多少种不同的方式? 如果名称中不包含空格、换行符或其他有问题的字符,并且中间目录始终是个位数,并且如果您在文件
文件中有要重命名的文件列表。list
每行有一个名称,则重命名的许多可能方法之一是:
sed 's%\(.*\)/\([0-9]\)/\(.*\)%mv \1/\2/\3 \1/\2_\3%' file.list | sh -x
您应该避免通过shell运行命令,直到您确定它将执行您想要的操作;只需查看生成的脚本,直到其正确
还有一个名为重命名的命令-不幸的是,有几种实现,但功能并不相同。如果您有一个基于Perl的名称(使用Perl正则表达式将旧名称映射到新名称),那么您可以使用:
rename 's%/(\d)/%/${1}_%' $(< file.list)
rename's%/(\d)/%/${1}{u%'$(
你想用多少种不同的方法来做
如果名称中不包含空格、换行符或其他有问题的字符,并且中间目录始终是个位数,并且如果您在文件文件中有要重命名的文件列表。list
每行有一个名称,则重命名的许多可能方法之一是:
sed 's%\(.*\)/\([0-9]\)/\(.*\)%mv \1/\2/\3 \1/\2_\3%' file.list | sh -x
您应该避免通过shell运行命令,直到您确定它将执行您想要的操作;只需查看生成的脚本,直到其正确
还有一个名为重命名的命令-不幸的是,有几种实现,但功能并不相同。如果您有一个基于Perl的名称(使用Perl正则表达式将旧名称映射到新名称),那么您可以使用:
rename 's%/(\d)/%/${1}_%' $(< file.list)
rename's%/(\d)/%/${1}{u%'$(
使用循环,如下所示:
while IFS= read -d $'\0' -r line
do
mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)
而IFS=read-d$'\0'-r行
做
mv“$line”“${line%/*}${line##*/}”
完成<使用循环,如下所示:
while IFS= read -d $'\0' -r line
do
mv "$line" "${line%/*}_${line##*/}"
done < <(find Folder -type f -print0)
而IFS=read-d$'\0'-r行
做
mv“$line”“${line%/*}${line##*/}”
完成<此解决方案对我有效
下面是一个bash脚本:
注意:如果任何文件名包含空格,则此脚本不起作用
#! /bin/bash
#只浏览当前目录中的目录。
对于$中的目录(查找/-类型d)
做
#删除前两个字符。
#最初,$dir=“./directory\u name”。
#在此步骤之后,$dir=“directory\u name”。
dir=“${dir:2}”
#如果$dir为空,则跳过。仅在$dir=“./”开始时发生。
如果[!$dir]
然后
持续
fi
#浏览目录中的所有文件。
对于$格式的文件(ls-d$dir/*)
做
#替换_
#例如,如果$file=“dir/filename”,则$new\u file=“dir\u filename”
#其中$dir=dir
新建\u文件=“${file/\/\u}”
#移动文件。
mv$文件$新文件
完成
#删除该目录。
rm-rf$dir
完成
- 将脚本复制粘贴到文件中
- 使用
chmod+x文件名
- 将脚本移动到目标目录。在您的情况下,这应该在
文件夹/
中
- 使用
/file\u name
运行脚本
这个解决方案对我很有效
下面是一个bash脚本:
注意:如果任何文件名包含空格,则此脚本不起作用
#! /bin/bash
#只浏览当前目录中的目录。
对于$中的目录(查找/-类型d)
做
#删除前两个字符。
#最初,$dir=“./directory\u name”。
#在此步骤之后,$dir=“directory\u name”。
dir=“${dir:2}”
#如果$dir为空,则跳过。仅在$dir=“./”开始时发生。
如果[!$dir]
然后
持续
fi
#浏览目录中的所有文件。
对于$格式的文件(ls-d$dir/*)
做
#替换_
#例如,如果$file=“dir/filename”,则$new\u file=“dir\u filename”
#其中$dir=dir
新建\u文件=“${file/\/\u}”
#移动文件。
mv$文件$新文件
完成
#删除该目录。
rm-rf$dir
完成
- 将脚本复制粘贴到文件中
- 使用
chmod+x文件名
- 将脚本移动到目标目录。在您的情况下,这应该在
文件夹/
中
- 使用
/file\u name
运行脚本
用它们更新您的问题!用他们更新你的问题!出于好奇,我正想问您是否有
rename
s可以做到这一点(我自己从未使用过),因为我相信您会知道的。您的编辑速度更快:-)+1。每天都忍不住要学越来越多的东西rename
是一个我不知道的命令,在这些情况下,它非常强大。我使用的是我从《骆驼》第一版中抄袭的版本(最初的Perl编程,用于Perl 4),尽管从那时起我对它进行了适度的更新。请参阅来源。@JonathanLeffler对不起,我很难实现你的想法。假设我在main文件夹
,并且没有任何文件。list
,如何重命名?我