如何使用查找/重命名重命名多个文件名

如何使用查找/重命名重命名多个文件名

我在 Samba 服务器上的目录/子目录中有很多包含特殊字符的文件。问题是,当我尝试使用 Windows 查看文件时,文件(包含特殊字符)不可见。因此,我编写了命令(如下)来更改具有特殊字符的文件名称,但是将重命名的文件放回目录/子目录无法正常工作:

find . -type f -exec rename -v 's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;

在底部我发布了包含要重命名的文件的当前目录:

./dir 1/fil[special char]e3.jpg
./dir 1/another dir2/m[special char]r.file1.txt
./dir 1/another dir2/file[special char]2.doc
./dir 3/next dir4/dir 5/fi[special char]le5.xml
./file 4.zip

预期 - 使用上述命令后(目录/子目录中的文件):

./dir 1/fil_e 3.jpg
./dir 1/another dir2/m_r_file1.txt
./dir 1/another dir2/file_2.doc
./dir 3/next dir4/dir 5/fi_le5.xml
./file 4.zip

现实 - 我运行命令的同一文件夹中的文件:

__dir 1_fil_e 3.jpg
__dir 1_another dir 2_m_r_file1.txt
__dir 1_another dir 2_file_2.doc
__dir 3_next dir4_dir 5_fi_le5.xml
__file 4.zip

我有两个问题:

  1. 如何从文件名中排除路径名?
  2. 如何将文件放入目录?

答案1

如果有,请使用-execdir选项 forfind而不是-exec

  • -exec从命令的根运行命令,并将每个路径作为参数
  • -execdir使用每个文件名作为参数在目标目录中运行命令

因此,

find . -type f -execdir rename -v 's/[^a-zA-Z0-9 &](?=[^.]*\.)/_/g' '{}' \;

请注意,自从发布此答案以来,rename问题和此答案中引用的命令已被替代方案取代:rename [options] expression replacement file…。此处显示的内容rename可能在您的系统上可用prename。如果没有,您可以下载并安装它使用这个食谱

相关内容