【发布时间】:2010-11-04 18:11:45
【问题描述】:
我正在使用此命令重命名空文件扩展名:
rename *. *.bla
但是,我有一个包含数百个此类子文件夹的文件夹,此命令需要我手动导航到每个子文件夹并运行它。
是否有一个命令可以只从一个上层文件夹运行,该文件夹将包含子文件夹中的所有文件?
【问题讨论】:
-
/我觉得它也属于这里
标签: windows command-line
我正在使用此命令重命名空文件扩展名:
rename *. *.bla
但是,我有一个包含数百个此类子文件夹的文件夹,此命令需要我手动导航到每个子文件夹并运行它。
是否有一个命令可以只从一个上层文件夹运行,该文件夹将包含子文件夹中的所有文件?
【问题讨论】:
标签: windows command-line
for /r c:\path\ %G in (*.) do ren "%G" *.bla
【讨论】:
@echo off
for /f "tokens=* delims= " %%i in ('dir /b/s/A-d') DO (
if "%%~xi" == "" rename "%%~fi" "%%~ni.bla"
)
感谢@Wadih M.Find and rename files with no extension?
【讨论】:
这将允许您输入名称中带有空格的目录。 (注意双 % 用于批处理文件,单 % 用于命令行。)
for /f "tokens=* delims= " %%a in ('dir /b /ad /s') do rename "%%a\*." "*.bla"
【讨论】:
您可以使用 Perl 模块 File::Find 轻松完成此操作以及更多操作。
#!perl
use strict;
use warnings;
use File::Find;
my $extension = 'bla';
my $directory = '/tmp/test';
print "Files renamed:\n";
find( \&wanted, $directory );
sub wanted {
return if /\./;
return unless -f $File::Find::name;
if ( rename( $File::Find::name, "$File::Find::name.$extension" ) ) {
print " $File::Find::name -> $File::Find::name.$extension\n";
}
else {
print " Error: $! - $File::Find::name\n";
}
}
【讨论】:
您可以使用for 来遍历子目录:
for /d %x in (*) do pushd %x & ren *. *.bla & popd
从批处理文件中使用它时,您需要将% 符号加倍:
for /d %%x in (*) do pushd %%x & ren *. *.bla & popd
【讨论】:
试试这个
for /R c:\temp %I in (*. ) DO Echo rename %I "%~nI.bla"
【讨论】:
使用 find 和 xargs 和 basename 将使表达式更易于阅读
准备一个像这样的重命名shell脚本(更正以处理多个文件)
#!/bin/sh
if [ $# -lt 3 ]
then
echo "usage: rename.sh sufold sufnew file1 (file2 file3 ...) "
exit
fi
sufold=$1
sufnew=$2
shift
shift
for f in $*
do
echo "to mv " $f `dirname $f`"/"`basename $f $sufold`$sufnew
mv $f `dirname $f`"/"`basename $f $sufold`$sufnew
done
然后你可以调用它来匹配你的条件的每个文件,包括通过 find 命令进行递归文件夹搜索
find . -name "*." | xargs rename.sh "." ".bla"
更常见的示例
find . -name "*.htm" | xargs rename.sh ".htm" ".html"
【讨论】: