在一个目录中,我有大约 150 个具有特定扩展名的文件,例如:
abc.ext
def.ext
ghi.ext
...
现在我想将所有这些文件也复制到新文件名(不带扩展名):
abc
def
ghi
完成这项工作的最短方法是什么?是否可以在 bash 文件中不编写循环?
编辑:谢谢您的回答(dirkt,约翰·纽曼)。
看到答案后,我会坚持使用较短的答案,尽管它有一个循环。
答案1
无需编写脚本(“bash 文件”)即可实现,但不使用循环则不行:
for f in *.ext ; do cp -- "$f" "$(basename "$f" .ext)" ; done
basename
可用于删除后缀。
答案2
没有循环绝对是可能的。好不好……这个就交给你了。
$ find . -type f -name "*.ext" -print0 | xargs -0 -I {} echo cp -T {} {}SUB | sed -e 's/\.extSUB//g'
向 sh 附加一个管道以退出试运行模式。反引号没有用,因为它会去除换行符,除非您处理 $IFS。正如前面提到的,反引号还存在其他字符问题。还需要 cp -T,因为最后一个参数通常需要一个目录。
我没有足够的“代表”来评论上面的内容,但是您可以使用 bash 的各种技巧${}
来避免basename
.
子字符串:${f:0:-4}
或最长匹配:${f%%.ext}