我有一堆文件的文件名遵循“filename.ext”模式。例如:
filename .ext
我想重命名所有这些以删除 .ext 之前的空格。例如:
filename.ext
我可以使用以下方法找到它们
find * -type f -name'* .*'
但是我该如何重命名所有这些文件呢?
答案1
创建一个名为“renamethis.sh”的文件。其内容应为:
#!/bin/bash
mv "$1" "$(echo $1 | sed 's/ \././')"
设置可执行位:chmod a+x renamethis.sh
。然后,运行如下命令:
find /path/to/dir -name '* .*' -type f -print0 | xargs -0L 1 /path/to/renamethis.sh
YMMV,没有明示或暗示的保证等。
值得一提的是,空格是导致这种情况的原因;只要文件名中没有其他奇怪的字符,就可以采用这种方法。如果有,您可能需要考虑使用 Perl 或 PHP 中的 scandir/readdir 循环之类的东西,但上面的脚本是我首先想到的。
答案2
这应该可以帮你解决。
#!/bin/bash
OLDIFS=${IFS}
IFS=$'\n'
for file in `find * -type f -name '* .*'`; do
_ext=`echo ${file} | cut -d '.' -f 2-`
_filename=`echo ${file} | cut -d ' ' -f 1`
mv "${file}" ${_filename}.${_ext}
done
IFS=${OLDIFS}
答案3
我看到您已经解决了当前的问题,但将来您可能需要考虑使用mmv
。
答案4
一行代码:
find -depth -name '* .*' -print0 |
perl -wn0e '$orig = $_; s/\s+\././g; rename($orig, $_) or warn "$orig: $!\n"'
强调:
- 在文件名中引用空格没有问题
- 文件名以破折号开头没有问题
- 快速:只有两个进程并行启动
- 正确处理目录