如何用find更改文件和目录名称?

时间:2013-06-07 19:24:54

标签: linux bash

我更改了项目名称,现在我有许多文件是旧名称的目录。如何用find?

替换这些名称
find . -name "*old_name*" -exec ???

6 个答案:

答案 0 :(得分:2)

find适合您:

find . -name "old_name" -execdir mv "{}" new_name +

这将从所有子目录中的当前目录中找到名称为old_name的文件,并将其重命名为new_name

答案 1 :(得分:1)

以下是我过去使用过的内容。最大的问题是RHEL重命名(c)vs Debian重命名(perl) - 它们有不同的选择。以下示例使用基于RHEL c的重命名命令。删除'-type f'以重命名目录。

find . -type f -name "*old_name*" -print0 | xargs -0 -I {} /usr/bin/rename "old_name" "new_name" {}

答案 2 :(得分:0)

newname="myfile.sh"; for files in $(find Doc2/scripts/ -name gw_watch_err.sh); do echo $files; dir=${files%/*}; cfile=${files##*/}; echo "$dir -- $cfile";  echo "mv $cfile $newname";  done
Doc2/scripts/gateway/gw_watch_err.sh
Doc2/scripts/gateway -- gw_watch_err.sh
mv gw_watch_err.sh myfile.sh

您还可以添加:

find . -maxdepth 1 -iname file

其中maxdepth将确保您不必担心子文件夹而iname意味着区分大小写

答案 3 :(得分:0)

好的,我的解决方案:

find . -name "*old_name*" -exec rename 's/old_name/new_name/g' {} \;

但这适用于名称不包含“old_name”的目录,否则请查找例如:

find: `./old_name': No such file or directory

因为它尝试在“old_name”目录中搜索,并且该目录已经是“new_name”

答案 4 :(得分:0)

使用find重命名多个目录:如何捕获渔获物

这是一个有关如何使用find重命名多个文件的小故事,但是为了不耐烦,我首先在此处输入针对您特定问题的正确命令:

find -depth -name "old name" -execdir mv -iv {} "new name" \;

,对于患者来说,find有一些误区,将更改仅限于目录:

  • 我们要在当前目录内将所有名为old dir的目录递归重命名为new dir

    • 我们创建一个空目录,在其中创建一个简单的目录层次结构:

      $ cd $(mktemp -d) && mkdir -p "old dir" "subdir/old dir/old dir"
      $ find | sort
      .
      ./old dir
      ./subdir
      ./subdir/old dir
      ./subdir/old dir/old dir
      
    • 使用-exec操作仅适用于直接在当前目录下进行的重命名,您可以通过空运行重命名命令来看到它(请注意 shell不输出引号,这不是错误):

      $ find -type d -name "old dir" -exec echo mv -iv {} "new dir" \;
      mv -iv ./subdir/old dir new dir
      mv -iv ./subdir/old dir/old dir new dir
      mv -iv ./old dir new dir
      

      请注意,只有第一个重命名命令才能按预期工作

    • 使用-execdir操作可从包含匹配目录的子目录中运行命令:

      $ find -type d -name "old dir" -execdir echo mv -iv {} "new dir" \;
      mv -iv ./old dir new dir
      mv -iv ./old dir new dir
      mv -iv ./old dir new dir
      

      这看起来不错,因为重命名命令在匹配的目录中运行,因此我们不再空运行:

      $ find -type d -name "old dir" -execdir mv -iv {} "new dir" \;
      './old dir' -> 'new dir'
      find: ‘./subdir/old dir’: No such file or directory
      './old dir' -> 'new dir'
      find: ‘./old dir’: No such file or directory
      $ find | sort
      .
      ./new dir
      ./subdir
      ./subdir/new dir
      ./subdir/new dir/old dir
      
      

      问题在于old dir重命名为new dir,而find不能在重命名的目录中进一步下降

    • 一种解决方案是在目录本身之前 处理每个目录的内容 ,这正是-depth选项的作用:

      $ cd $(mktemp -d) && mkdir -p "old dir" "subdir/old dir/old dir"
      $ find -depth -type d -name "old dir" -execdir mv -iv {} "new dir" \;
      './old dir' -> 'new dir'
      './old dir' -> 'new dir'
      './old dir' -> 'new dir'
      $ find | sort
      .
      ./new dir
      ./subdir
      ./subdir/new dir
      ./subdir/new dir/new dir
      

答案 5 :(得分:-1)

1。首先,备份您的目录和文件

以下Bash代码在我的OS X和Ubuntu框上运行。

2。将目录从 old_dir 重命名为 new_dir

for d in $(find . -maxdepath X -type d -name 'old_dir'); do mv $d "$(dirname $d)/new_dir"; done

X 是一个用于指定替换深度的数字 old_dir

3。将文件从 old_file 重命名为 new_file

for f in $(find . -type f -name 'old_file'); do mv $f "$(dirname $f)/new_file"; done
  1. 不关心@ Benjamin W.和@ ghoti他们的 ForMatted代码 和@ghoti尝试将问题定位到他的陷阱。
  2. 嗨,@ Benjamin W.这篇新帖怎么样?和@ ghoti你在你的机器上错误地运行了上面的代码吗?如果代码无法正常工作,请让我知道或发布一个问题,如果你有一个更好的帖子,请告诉我们。