【问题标题】:Batch renaming files and directories with bash使用 bash 批量重命名文件和目录
【发布时间】:2021-04-04 19:16:04
【问题描述】:

我有几个文件夹,其中包含按流派、艺术家和专辑组织的 mp3 文件。 我想要大写字母的流派,但层次结构中的所有内容都使用小写字母并且没有特殊字符和空格。

为此,我编写了一个 bash 脚本,它接受所有子文件夹中文件夹的路径,并且文件应重命名:

#!/bin/bash

#Aufruf:
#$ ./alles.klein '/home/anja/Musik/HOERSPIELE' 

PFAD=$1

cd $PFAD

depthVarations=("-maxdepth 1 -type d" "-depth -type d" "-depth -type f") 

for i in "${depthVarations[@]}"
do
    :
    date
    echo $i
    find  .  $i -exec rename 'y/A-Z/a-z/' {} \;
    
    date
    echo $i
    find  .  $i -exec rename 's/(.*)(\.\/)(.*)/$1\/\L$3/' {} \;
    
    #.... several more regex variations
done

我的问题是它试图改变整个路径,而不仅仅是我想要改变的部分,例如

/home/anja/Musik/ORIENTALISCHES/A-wa 

变成现在

/home/anja/musik/orientalisches/a-wa  #everything is lowercase

期望的结果是:

/home/anja/Musik/ORIENTALISCHES/a-wa

如您所见,musik/orientalisches 也更改为小写。 我希望通过“cd”进入正确的文件夹,我可能只会得到下面的路径,但它似乎不是那样工作的。

【问题讨论】:

  • 我想,我做到了。位,我调整了我的描述以使其更易于理解

标签: bash rename


【解决方案1】:

您可以使用-execdir 而不是-exec 来仅小写文件名:

find . "$i" -execdir rename -n 'y/A-Z/a-z/' {} \;

否则你可以使用这个rename 命令:

find . "$i" -exec rename 's~^(.*/)(.+)~$1\L$2~' {} \;

find . "$i" -execdir rename 's~(.+)~\L$1~' {} \;

【讨论】:

  • 第一个例子在输出中给了我错误:Can't rename ./warda /warda: Invalid cross-device link 我猜它不能重命名它,因为它已经存在?但它成功了,只重命名了我想要重命名的内容。
猜你喜欢
  • 2010-10-10
  • 1970-01-01
  • 2012-09-02
  • 2022-01-15
  • 2012-12-24
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2011-10-20
相关资源
最近更新 更多