我的目录中有多个文件。例如:
eventDataLog.txt.2015-04-23-22
eventDataLog.txt.2015-04-23-23
eventDataLog.txt.2015-04-24-01
eventDataLog.txt.2015-04-24-02
eventDataLog.txt.2015-04-24-03
eventDataLog.txt.2015-04-24-04
我想将它们全部更改为
abc-eventDataLog.txt.2015-04-23-22
abc-eventDataLog.txt.2015-04-23-23
abc-eventDataLog.txt.2015-04-24-01
abc-eventDataLog.txt.2015-04-24-02
abc-eventDataLog.txt.2015-04-24-03
abc-eventDataLog.txt.2015-04-24-04
如何使用 mv 命令来执行此任务?我用过这个
mv eventDataLog.txt.2015-* ec2prod-eventDataLog.txt.2015-*
mv: target ‘ec2prod-eventDataLog.txt.2015-*’ is not a directory
但不起作用
但请记住,我在该目录中有许多其他文件,因此答案是适当的,而且我还必须忽略此文件 eventDataLog.txt,因为它是当前文件并且正在使用。
答案1
Bash 对此很有用。
for FILE in eventDataLog.txt.2015*; do mv "$FILE" "abc-$FILE"; done
答案2
您可以使用rename
命令来完成此操作。在你的情况下你会这样做rename eventDataLog.txt.2015 abc-eventDataLog.txt.2015 eventDataLog.txt*
。
它使用的语法是rename frompattern topattern listoffilessuchaswildcardmatch
.
答案3
我会使用这个mmv
工具并做
mmv eventDataLog.txt.\* abc-eventDataLog.txt.\#1
这是专门为批量重命名而设计的。
答案4
命令
for FILE in $(ls -1 | egrep '^eventDataLog' | egrep -v '^eventDataLog.txt$'); do mv $FILE abc-$FILE; done
笔记
egrep
是支持正则表达式的版本,grep
并且包含grep
在大多数发行版中- 首先
egrep
将过滤以“eventDataLog”开头的所有文件 - 第二
egrep
将过滤所有文件不要(笔记-v
注意到逆match)匹配您想要忽略的文件的全名
证明
$ ls -1
eventDataLog.txt
eventDataLog.txt.2015-04-23-22
eventDataLog.txt.2015-04-23-23
eventDataLog.txt.2015-04-24-01
eventDataLog.txt.2015-04-24-02
eventDataLog.txt.2015-04-24-03
eventDataLog.txt.2015-04-24-04
myOtherFile
mySecondOtherFile
$ for FILE in $(ls -1 | egrep '^eventDataLog' | egrep -v '^eventDataLog.txt$'); do mv $FILE abc-$FILE; done
$ ls -1
abc-eventDataLog.txt.2015-04-23-22
abc-eventDataLog.txt.2015-04-23-23
abc-eventDataLog.txt.2015-04-24-01
abc-eventDataLog.txt.2015-04-24-02
abc-eventDataLog.txt.2015-04-24-03
abc-eventDataLog.txt.2015-04-24-04
eventDataLog.txt
myOtherFile
mySecondOtherFile