在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
      ,如何重命名?我