我正在使用 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
答案3
这将递归查找一组文件,并mv
使用处理名称对其进行重命名sed
。您可以更改文件规范并添加sed
命令。
find . \( -name "1*.jpg" -o -name "1*.txt" \) -type f -exec sh -c mv "{}" "$(echo {} | sed '...')" \;