【问题标题】:Find and rename a directory查找并重命名目录
【发布时间】:2012-10-13 21:56:39
【问题描述】:

我正在尝试在 linux 系统上查找并重命名目录。

文件夹名称类似于:thefoldername-23423-431321

thefoldername 是一致的,但数字每次都在变化。

我试过了:

find . -type d -name 'thefoldername*' -exec mv {} newfoldername \;

该命令确实有效并重命名该目录。但是我在终端上收到一个错误,说没有这样的文件或目录。

我该如何解决?

【问题讨论】:

  • 请注意,这也会将重命名的目录移动到您在其中运行 find 命令的任何目录中。它将不再位于找到它的任何位置。
  • 只是为了仔细检查,您是否希望所有与该模式匹配的文件夹都被重命名为相同的东西?您所拥有的会将oldName-1-1, oldName-1-2, oldName-1-3, ... 重命名为newName。它不会将其重命名为newName-1-1, newName-1-2, newName-1-3,...。这就是你想要的吗?
  • @Ari 谢谢,任何时候都只有一个目录。

标签: linux bash find exec


【解决方案1】:

这是一个无害的错误,您可以使用 -depth 选项消除它。

find . -depth -type d -name 'thefoldername*' -exec mv {} newfoldername \;

Find 的正常行为是处理目录,然后递归到其中。由于您已将其重命名,因此在尝试递归时会发现抱怨。 -depth 选项告诉 find 先递归,然后再处理目录。

【讨论】:

  • 如果您想保留匹配文件夹前缀的路径(因为它可能处于某个深度)并重命名它,情况如何?你能举个例子吗?谢谢!
  • @carlspring 也许你可以在一个单独的问题中问这个问题。
  • 完成!请在此处查看:stackoverflow.com/questions/18027799/…
【解决方案2】:

使用上一个答案,我的文件夹内容消失了。
这是我的解决方案。它运作良好: for i in find -type d -name 'oldFolderName'; do dirname=$(dirname "$i") mv $dirname/oldFolderName $dirname/newFolderName done

【讨论】:

  • 对我来说只能这样工作:for i in find . -type d -name 'led';do mv $(dirname "$i")/oldname $(dirname "$i")/newname;完成
  • 我认为“查找”应该用引号引起来,否则它不起作用。像这样:for i in `find . -type d -name 'myDir'`;do dirname=$(dirname "$i");mv $dirname/myDir $dirname/_old_myDir; done
【解决方案3】:

缺少 -execdir 选项!如 find 的手册页所述:

-execdir command {};

类似于-exec,但指定的命令是从包含匹配文件的子目录运行的,通常不是您开始查找的目录。

find . -depth -type d -name 'thefoldername*' -execdir mv {} newfoldername \;

【讨论】:

    【解决方案4】:

    .../ABC -> .../BCD

    find . -depth -type d -name 'ABC' -execdir mv {} $(dirname $i)/BCD \;
    

    【讨论】:

    • 请对您的回答提供一些解释
    【解决方案5】:

    将 1100 替换为 old_value,将 2200 替换为您要替换的 new_value。

    例子

    for i in $(find . -type d -iname '1100');do echo "mv "$i" "$i"__" >> test.txt; sed 's/1100__/2200/g' test.txt > test_1.txt; bash test_1.txt ; rm test*.txt ; done
    

    证明

    [用户@服务器测试]$ ls -la check/

    drwxr-xr-x。 1 个用户用户 0 Jun 7 12:16 1100

    [用户@服务器测试]$for i in $(find . -type d -iname '1100');do echo "mv "$i" "$i"__" >> test.txt; sed 's/1100__/2200/g' test.txt > test_1.txt; bash test_1.txt ; rm test*.txt ; done

    [用户@服务器测试]$ ls -la check/

    drwxr-xr-x。 1 个用户用户 0 Jun 7 12:16 2200

    这里 sed 中的 __ 只是用来改名字而已,没有其他意义

    【讨论】:

      猜你喜欢
      • 2016-01-19
      • 1970-01-01
      • 2021-06-09
      • 1970-01-01
      • 2016-01-07
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多