我在一个文件夹中有很多文件,格式为“{galaxyID}-cutout-HSC-I-{#}-pdr2_wide.fits”,其中 {galaxyID} 和 {#} 是每个文件的不同数字。这里有些例子:
2185-cutout-HSC-I-9330-pdr2_wide.fits
992-cutout-HSC-I-10106-pdr2_wide.fits
2186-cutout-HSC-I-9334-pdr2_wide.fits
我想更改此文件夹中所有文件的格式以匹配以下内容:
2185_HSC-I.fits
992_HSC-I.fits
2186_HSC-I.fits
即,我想从每个文件名中取出“cutout”、第二个数字和“pdr2_wide”。我更愿意在 Perl 或 Python 中执行此操作。对于我的 Perl 脚本,到目前为止我有以下内容:
rename [-n];
my @parts=split /-/;
my $this=$parts[0].$parts[1].$parts[2].$parts[3].$parts[4].$parts[5];
$_ = $parts[0]."_".$parts[2]."_".$parts[3];
*fits
这给了我错误信息
Not enough arguments for rename at ./rename.sh line 3, near "];" Execution of ./rename.sh aborted due to compilation errors.
我包含了 ,[-n]
因为我想在实际操作之前确保更改是我想要的;无论哪种方式,为了安全起见,这是在一个重复的目录中。
看起来你正在使用rename
你在 Ubuntu 上得到的(它不是我的 ArchLinux 机器上的那个),但还有其他的。但是,你提出的很奇怪。周围的括号-n
不应该在那里,;
命令结束。
如果您使用的是我认为的语法,则语法是这样的:
% rename -n -e PERL_EXPR file1 file2 ...
Perl 表达式是-e
switch的参数,可以是一个简单的替换。请注意,此表达式是您提供给 的字符串-e
,因此可能需要引用:
% rename -n -e 's/-\d+-pdr2_wide//' *.fits
rename(2185-cutout-HSC-I-9330-pdr2_wide.fits, 2185-cutout-HSC-I.fits)
而且,我不会一步完成,而是分两步完成:
% rename -n -e 's/-cutout-/-/; s/-\d+-pdr2_wide//' *.fits
rename(2185-cutout-HSC-I-9330-pdr2_wide.fits, 2185-HSC-I.fits)
还有其他可能有意义的模式。您可以保留零件,而不是带走零件:
% rename -n -e 's/\A(\d+).*(HSC-I).*/$1-$2.fits/' *.fits
rename(2185-cutout-HSC-I-9330-pdr2_wide.fits, 2185-HSC-I.fits)
我倾向于使用命名捕获,以便下一个可怜的懒汉知道你在做什么:
% rename -n -e 's/\A(?<galaxy>\d+).*(HSC-I).*/$+{galaxy}-$2.fits/' *.fits
rename(2185-cutout-HSC-I-9330-pdr2_wide.fits, 2185-HSC-I.fits)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句