在批处理文件夹重命名上插入字符


2

我有一个文件夹,其中包含成千上万个名为“ ABC 123456”的文件。我需要在两个文本块之间添加一个破折号,例如“ ABC-123456”。离开尾随空间。

Automator没有提供一种用于在其中计数4个字符并插入新的破折号和空格的方法。

我有这个终端命令,并且一直在修改它。

for file in *.txt
do
  echo mv "$file" **"$file" count 3 "- "**
done

任何人都知道Applescript,或者可以通过终端命令帮助我重命名文件?

Answers:


3

这个问题本身也不是很精确,因为OP谈论的是:

  • 文件名类似ABC 123456(不带扩展名),但在示例代码中使用*.txt扩展名
  • 在两个块(例如,空格在哪里)之间添加破折号ABC - 123456,但是在接下来的时间里加上counting to 4count 3,例如,不能完全清除脚本应该执行的操作,例如,如果find ABCD 12AB 345
  • 另外,要保留结尾空间,这很奇怪-但可以;)

该问题可分为3个单独的部分:

  1. 选择正确的文件进行重命名
  2. 准备新文件名,在旧文件名中替换/添加字符
  3. “物理”重命名

广告“选择正确的文件”。选择文件可以通过某些外部实用程序来完成,例如通过find命令。的主要好处find是:

  • 它也可以在子目录中递归搜索文件
  • 可以更精确地选择正确的文件,例如排除目录,按时间或大小选择文件等等。(从终端检查man find。)

广告“准备新名称”。这可以通过外部程序来完成,比如sedawk或什么可以在shell脚本处理文本,任何程序或者是可以做到(在一些简单的情况下,这些本)withing的bash本身-并且可能节省昂贵的一个命令执行。(对于成千上万的文件而言,这有所作为)。

下列:

${file/ /-}

破折号()替换(替换)一个空格/ /部分)。所以有可能写/-

mv "$file" "${file/ /-}"

并保存sed执行。

因此,替代解决方案之一可能是,例如:

#!/bin/bash
while IFS= read -r -d $'\0' filename
do
    newfilename="${filename/ /-}"
    [[ "$filename" != "$newfilename" ]] && echo mv -i "$filename" "$newfilename"
done < <(find . -maxdepth 1 -type f -iname "* *.jpg" -print0)

abobe适用于DRY RUN-它只会显示,将要执行的操作,对于真正的执行,请删除echo

分解:

  • 选择正确的文件进行重命名:find . -maxdepth 1 -type f -iname "* *.jpg" -print0将找到所有

    • 当前目录中只有什么(-maxdepth 1
    • 它们是普通文件-type f
    • 并且它们的名称与(anything)(space)(anything).jpg不区分大小写匹配-例如,名称必须包含一个空格
    • 提供的文件名以null结尾,因此它们的名称也可以安全地包含换行符。(-print0
  • 周期 while IFS= read -r -d $'\0' filename; do ... done < <( )

    • 读取上述find命令的输出
    • 文件名以null结尾的-d $'\0'
    • 忽略任何转义字符(-r)/高级主题-此处无需解释/
    • - IFS= 防止修剪文件名中的前导和尾随空格(也是高级主题)
  • 准备新的文件名 newfilename="${filename/ /-}"

    • bash内部完成(不执行外部命令)。
    • 如果要在破折号使用后保留尾随空间 ${filename/ /- }
  • 实际的重命名是通过mv命令(man mv从终端查看)完成的,其中

    • -i什么会询问用户是否在这里已经是与新的文件名(不重写)
  • 并且mv仅当newfilename不同于时才执行。filename [[ "$filename" != "$newfilename" ]]

上面的解决方案通常很容易出错,但是仍然不是很有效,因为数十万个文件将执行数十万次mv命令。解决方案可以是:使用某些实用程序,无需执行mvN次命令即可读取文件名并进行重命名。例如,系统的“大手枪”将“ perl”管理为:

find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
    perl -0nle '$n=$_; $n=~s/ /-/; rename $_,$n unless($_ eq $n || -e $n)'

将重命名所有文件的文件将find在一次执行中输出-例如,快于数千次mv执行。

Tor测试(DRY RUN)使用以下方法:

find . -maxdepth 1 -type f -iname "*.jpg" -print0 |\
    perl -0nle '$n=$_; $n=~s/ /-/; print qq{old:$_ new:$n\n} unless($_ eq $n || -e $n)' #print instead of the rename

附言:perl功能强大,足以处理一切本身,例如。也可以使用find命令,但这是更高级的主题...

Ps2:我的英语水平比我的差很多bash,所以有人可以编辑此帖子以添加/更正内容。.;;)


2

如果您的文件名是“ ABC 123456”,并且前3个字符与后面的字符之间有单个空格,则您尝试用字符(或破折号或其他字符)替换该空格,使其看起来像ABC-123456。

我发现这篇文章解释了如何做到这一点。

例:

请注意,以下命令仅将连字符替换为空格。如果您需要其他替换,则必须相应地修改命令

for i in *.JPG; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done

其他:

如果您要使用下划线或其他字符代替连字符,只需s, ,-,g将上述命令的一部分切换为即可s, ,_,g

对于如何看这篇文章

这是我的MBA 10.9.5 测试(我使用了ABC 123456.png文件)并将其放置在新文件夹中。比我在终端中的目录中执行cd并运行

for i in *.png; do mv "$i" "`echo $i | sed -e 's, ,-,g'`"; done

结果是,它很好用(它重命名了文件)

它是如何工作的:它将替换该文件夹中所有* .png文件的文件名中的空格,因此请确保先将其放在正确的文件夹中。

改名

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.