227 unix rename file batch-rename
目录中有多个以prefix开头的文件fgh,例如:
fghfilea
fghfileb
fghfilec
Run Code Online (Sandbox Code Playgroud)
我想重命名所有这些以前缀开头jkl.是否有单个命令来执行此操作而不是单独重命名每个文件?
Ste*_*202 272
有几种方法,但使用rename可能是最简单的方法.
使用以下版本rename:
rename 's/^fgh/jkl/' fgh*
Run Code Online (Sandbox Code Playgroud)
rename fgh jkl fgh*
Run Code Online (Sandbox Code Playgroud)
您应该检查平台的手册页以查看上述哪个适用.
nik*_*nik 107
这是如何sed以及mv可以一起使用来重命名:
for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done
Run Code Online (Sandbox Code Playgroud)
按下面的评论,如果文件名有空格的,报价可能需要围绕子的函数,返回名称的文件移动到:
for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done
Run Code Online (Sandbox Code Playgroud)
gho*_*g74 73
重命名可能不在每个系统中.所以如果你没有它,请在bash shell中使用shell这个例子
for f in fgh*; do mv "$f" "${f/fgh/xxx}";done
Run Code Online (Sandbox Code Playgroud)
Lee*_*ton 37
使用mmv:
mmv "fgh*" "jkl#1"
Run Code Online (Sandbox Code Playgroud)
iwe*_*ein 19
有很多方法可以做到(并非所有这些方法都适用于所有unixy系统):
ls | cut -c4- | xargs -I§ mv fgh§ jkl§
§可能被您认为方便的任何东西取代.您也可以这样做,find -exec但在许多系统上表现略有不同,所以我通常会避免这种情况
for f in fgh*; do mv "$f" "${f/fgh/jkl}";done
原油但他们说的有效
rename 's/^fgh/jkl/' fgh*
真的很漂亮,但BSD上没有重命名,这是最常见的unix系统.
rename fgh jkl fgh*
ls | perl -ne 'chomp; next unless -e; $o = $_; s/fgh/jkl/; next if -e; rename $o, $_';
如果您坚持使用Perl,但系统上没有重命名,则可以使用此怪物.
其中一些有点复杂,列表远未完成,但你会在这里找到你想要的几乎所有unix系统.
Jud*_*y2K 13
rename fgh jkl fgh*
Run Code Online (Sandbox Code Playgroud)
使用find,xargs和sed:
find . -name "fgh*" -type f -print0 | xargs -0 -I {} sh -c 'mv "{}" "$(dirname "{}")/`echo $(basename "{}") | sed 's/^fgh/jkl/g'`"'
Run Code Online (Sandbox Code Playgroud)
它比@nik的解决方案更复杂,但它允许递归地重命名文件.例如,结构,
.
??? fghdir
? ??? fdhfilea
? ??? fghfilea
??? fghfile\ e
??? fghfilea
??? fghfileb
??? fghfilec
??? other
??? fghfile\ e
??? fghfilea
??? fghfileb
??? fghfilec
Run Code Online (Sandbox Code Playgroud)
会变成这个,
.
??? fghdir
? ??? fdhfilea
? ??? jklfilea
??? jklfile\ e
??? jklfilea
??? jklfileb
??? jklfilec
??? other
??? jklfile\ e
??? jklfilea
??? jklfileb
??? jklfilec
Run Code Online (Sandbox Code Playgroud)
使其工作的关键xargs是从xargs调用shell.
通用命令是
find /path/to/files -name '<search>*' -exec bash -c 'mv $0 ${0/<search>/<replace>}' {} \;
其中<search>和<replace>应分别替换为您的源和目标。
作为针对您的问题量身定制的更具体的示例(应从文件所在的同一文件夹运行),上面的命令如下所示:
find . -name 'gfh*' -exec bash -c 'mv $0 ${0/gfh/jkl}' {} \;
对于“空运行”,添加echobefore mv,以便您可以看到生成了哪些命令:
find . -name 'gfh*' -exec bash -c 'echo mv $0 ${0/gfh/jkl}' {} \;
| 归档时间: |
|
| 查看次数: |
257774 次 |
| 最近记录: |