如何使用 cygwin(或 linux 命令)通过正则表达式递归重命名文件和目录

如何使用 cygwin(或 linux 命令)通过正则表达式递归重命名文件和目录

我正在使用 Windows,并尝试使用 Cygwin 执行此任务。我想按如下方式递归重命名文件和目录:
来自:
1010110010\
1010110010\1010110010.jpg
1010110010\1010110010.txt
1010110020\
1010110020\1010110020.jpg
1010110020\1010110020.txt
...

至:
1-01-01-1-001-0\
1-01-01-1-001-0\1-01-01-1-001-0.jpg
1-01-01-1-001-0\1-01-01-1-001-0.txt
1-01-01-1-002-0\
1-01-01-1-002-0\1-01-01-1-002-0.jpg
1-01-01-1-002-0\1-01-01-1-002-0.txt
...

我考虑过使用 for 循环,但是 for 循环无法递归遍历目录。我只能使用 for 和 sed 来重命名目录中的文件列表:

for i in *; do j=`echo $i | sed 's/\(.\)\(..\)\(..\)\(.\)\(...\)\(.\)/\1-\2-\3-\4-\5-\6/g'`; mv $i $j; done

但我想重命名几个目录及其中的文件。因此,我尝试了“find”,但我不知道如何在“find”命令中使用变量和正则表达式。除此之外,由于我使用的是 Cygwin,我只能使用“mv”命令,而不能使用“rename”命令。感谢您的任何建议。

答案1

Unix 有几种强大的文件重命名方法。下面是使用 zsh 的方法(请确保已安装)。该方法首先重命名目录,然后重命名目录中的文件。

autoload zmv
zmv -o -i '(?)(??)(??)(?)(???)(?)' '$1-$2-$3-$4-$5-$6'
zmv -o -i '(*)/(?)(??)(??)(?)(???)(?).(*)' '$1/$2-$3-$4-$5-$6-$7.$8'

从您的问题中无法明确目录是否可以嵌套。如果可以,这里有一个命令可以同时处理目录和文件,利用一个模式替换即可同时处理两者的事实:

zmv -o -i '(**/)(?)(??)(??)(?)(???)(*)' '$1$2-$3-$4-$5-$6-$7$8'

如果您将-n选项传递给zmv,它将显示该命令在不实际移动文件的情况下会执行的操作。我-o -i在示例中使用它,以便如果它要覆盖文件,它会提示确认,否则会默默执行。

zmv在手册页中有记录zshcontrib

答案2

文件::重命名或 Debian 的prename脚本,均用 Perl 编写。

答案3

这将递归查找一组文件,并mv使用处理名称对其进行重命名sed。您可以更改文件规范并添加sed命令。

find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;

相关内容