我有一个名为windows的目录,其中包含名称包含空格的文件。我想用下划线_替换文件名中的空格。我需要更正windows目录中的所有文件名。
windows
_
约束条件:
我正在寻找一个解决方案,尊重上述所有限制。任何帮助或指导将不胜感激。谢谢!
lymgl2op1#
使用内置的-regex条件来匹配文件名,而不是通过管道连接到grep。使用内置的-exec操作符执行bash命令以执行文件名替换和mv命令。在命令替换中使用sed来执行空间替换。
-regex
grep
-exec
bash
mv
sed
find windows -type f -regex '/.{4} .{4} .{4}-[0-9A-Za-z]{1,3}$' -exec bash -c 'mv "$1" "$(sed "s/ /_/g" <<<"$1")"' {} {} \;
字符串
w1jd8yoj2#
一条注解澄清了感兴趣的文件名遵循严格的命名约定:所有文件都遵循特定的模式:四个字母、一个空格、四个字母、一个空格、四个字母、一个连字符和一到三个数字于是:
find windows -maxdepth 1 -type f | grep -iE '^windows([/ ][a-z]{4}){3}-[0-9]{1,3}$' | xargs -r -n3 sh -c 'mv "$*" $1_$2_$3' --
字符串另一条评论指出:我只能使用基本的Ubuntu发行版中提供的内容coreutils(mv)、findutils(find/xargs)、grep(grep)和dash(sh)都是Ubuntu中必需的软件包。base64也是必需的,允许:
find
xargs
sh
base64
echo ZmluZCB3aW5kb3dzIC1tYXhkZXB0aCAxIC10eXBlIGZ8Z3JlcCAtaUUgJ153aW5kb3dzKFsvIF1bYS16XXs0fSl7M30tWzAtOV17MSwzfSQnfHhhcmdzIC1yIC1uMyBzaCAtYyAnZWNobyBtdiAiJCoiICQxXyQyXyQzJyAt | base64 -d | sh
型
qmelpv7a3#
find windows -depth -exec rename -e 's/ /_/g' {} +
字符串-depth(如果需要),如果任何带有空格的文件名是目录。这个rename在某些发行版上以perl-rename的形式提供。同样的想法,只是没有rename:
-depth
rename
perl-rename
find windows -depth -exec perl -e' use File::Basename qw( fileparse ); for ( @ARGV ) { my $old = $_; my ( $f, $d ) = fileparse( $_ ); $f =~ s/ /_/g; my $new = $d.$f; rename( $old, $new ) if $new ne $old; } ' {} +
型同样的想法,但是将循环从perl移动到find,这样你就看不到for了(但是它引入了一个shell特殊字符\):
perl
for
\
find windows -depth -exec perl -e' use File::Basename qw( fileparse ); my $old = $ARGV[0]; my ( $f, $d ) = fileparse( $old ); $f =~ s/ /_/g; my $new = $d.$f; rename( $old, $new ) if $new ne $old; ' {} \;
3条答案
按热度按时间lymgl2op1#
使用内置的
-regex
条件来匹配文件名,而不是通过管道连接到grep
。使用内置的
-exec
操作符执行bash
命令以执行文件名替换和mv
命令。在命令替换中使用
sed
来执行空间替换。字符串
w1jd8yoj2#
一条注解澄清了感兴趣的文件名遵循严格的命名约定:
所有文件都遵循特定的模式:四个字母、一个空格、四个字母、一个空格、四个字母、一个连字符和一到三个数字
于是:
字符串
另一条评论指出:
我只能使用基本的Ubuntu发行版中提供的内容
coreutils(
mv
)、findutils(find
/xargs
)、grep(grep
)和dash(sh
)都是Ubuntu中必需的软件包。base64
也是必需的,允许:型
qmelpv7a3#
字符串
-depth
(如果需要),如果任何带有空格的文件名是目录。这个
rename
在某些发行版上以perl-rename
的形式提供。同样的想法,只是没有
rename
:型
同样的想法,但是将循环从
perl
移动到find
,这样你就看不到for
了(但是它引入了一个shell特殊字符\
):型