在目录的所有文件名中查找并替换另一个单词

时间:2013-07-19 18:42:21

标签: linux shell grep

我正在尝试在我的目录(以及所有子目录)的所有文件名中将“owner”替换为“user”。

实施例

owners_controller => users_controller
owner.rb => user.rb

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:2)

使用find-exec选项在名称中包含“ owner ”的每个文件和子目录上调用rename

find path/to/my/directory/ -depth -name "*owner*" -exec /usr/bin/rename owner user {} \+

如果您没有rename,则可以使用带有mv参数扩展的bash命令:

find path/to/my/directory/ -depth -name "*owner*" -exec \
  bash -c 'mv "{}" $(old="{}"; new="${old##*/}"; echo "${old%/*}/${new/owner/user}")' \;

bash -c '...'调用单引号包围的单行上的bash shell。单行充当mv命令,将匹配的文件名/子目录的基名中出现的所有“所有者”重命名为“ user ”。< / p>

具体而言,find{}之后的每个-exec替换为匹配的文件/子目录的路径名。这里mv接受两个论点;第一个是{}(前面已描述过),第二个是从包含三个bash命令的子shell $(...)返回的字符串。这些bash命令使用parameter expansion techniques重命名{}的基本名称。

答案 1 :(得分:1)

如果您没有安装rename,这应该是一个合理的选择(假设bash为您的shell):

while read entry
do
  mv "${entry}" "${entry/owner/user}"
done < <(find . -depth -name '*owner*' -print)