5

我更改了项目名称,现在我有很多文件和旧名称的目录。如何用 find 替换这些名称?

find . -name "*old_name*" -exec ???
4

6 回答 6

2

find应该适合你:

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

这将old_name在所有子目录中找到具有当前目录名称的文件并将它们重命名为new_name.

于 2013-06-07T19:52:05.410 回答
1

以下是我过去使用过的。最大的问题是 RHEL 重命名 (c) 与 Debian 重命名 (perl) - 它们采用不同的选项。下面的示例使用基于 RHEL c 的重命名命令。删除“-type f”以重命名目录。

find . -type f -name "*old_name*" -print0 | xargs -0 -I {} /usr/bin/rename "old_name" "new_name" {}
于 2013-06-07T20:09:04.797 回答
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”

于 2013-06-07T20:50:53.087 回答
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 表示区分大小写

于 2013-06-07T20:13:45.127 回答
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
      
于 2019-07-13T21:26:33.890 回答
-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 尝试将问题定位到他的陷阱。

嗨,@ Benjamin W.这个新帖子怎么样?和@ghoti你是不是在你的机器上错误地运行了上面的代码?如果代码不起作用,请告诉我或发布问题,如果您有更好的问题,请在此处发布,让我们知道。

于 2016-05-23T03:16:52.973 回答