问题描述
我在linux服务器上有很多具有这种格式的文件
text_text_mixturelettersnumbers.file
,例如Hesperocyparis_goveniana_E00196073A.bam.bai
或Hesperocyparis_forbesii_RBGEH19_bwa_out.txt
。我想将第一个下划线更改为连字符,并保留所有其他内容,使其看起来像这样text-text_mixturelettersnumbers.file
。
我尝试了rename -n 's/(\w+)_(\w+_.)/$1-$2/' *
及其许多不同的版本,但是什么也没有发生。有人可以指出我错了吗?
谢谢
马库斯
解决方法
util-linux
rename不能仅显示结果。这是非常基本的。
如果要列出扩展名前包含两个下划线的文件,请使用
//path to .so library file
Module pkcs11Module = Module.getInstance(this.getProperties().getProperty("PKCS11_LIBRARY"));
pkcs11Module.initialize(null);
Slot[] slotsWithToken = pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT);
CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
for(Slot s : slotsWithToken) {
Session session = s.getToken().openSession(Token.SessionType.SERIAL_SESSION,Token.SessionReadWriteBehavior.RO_SESSION,null,null);
session.findObjectsInit(new X509PublicKeyCertificate());
Object[] objects = null;
while((objects = session.findObjects(1)).length > 0) {
for(Object c : objects) {
X509PublicKeyCertificate cert = (X509PublicKeyCertificate) c;
byte[] certValue = cert.getValue().getByteArrayValue();
Certificate cc = certFactory.generateCertificate(new ByteArrayInputStream(certValue));
if(cc instanceof X509Certificate) {
X509Certificate x509 = (X509Certificate) cc;
//COMMON NAME:
String name = new X500Name(x509.getSubjectDN().getName()).getRDNs()[0].getFirst().getValue().toString();
Collection<List<?>> altNames = x509.getSubjectAlternativeNames();
for(List<?> list : altNames) {
ASN1Sequence seq = ASN1Sequence.getInstance(new ASN1InputStream(new ByteArrayInputStream((byte[]) list.get(1))).readObject());
ASN1TaggedObject obj = (ASN1TaggedObject) seq.getObjectAt(1);
//ALT NAME:
String upn = obj.getObject().toString();
upn = upn.substring(upn.lastIndexOf("]") + 1);
}
}
}
}
}
要实际重命名,请使用for f in *_*_*.*; do
echo "$f => ${f/_/-}";
done
:
mv
for f in *_*_*.*; do
mv -- "$f" "${f/_/-}";
done
将变量"${f/_/-}"
中的第一个_
替换为-
。