我在 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
如果有,请使用-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
。如果没有,您可以下载并安装它使用这个食谱。