13

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

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

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

我试过这个:

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

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

我该如何解决?

4

5 回答 5

21

-depth这是一个无害的错误,您可以通过该选项摆脱它。

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

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

于 2012-10-23T21:20:52.933 回答
6

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

-execdir command {};

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

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

于 2016-11-23T11:41:38.997 回答
1

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

于 2014-09-30T14:53:09.333 回答
0

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

find . -depth -type d -name 'ABC' -execdir mv {} $(dirname $i)/BCD \;
于 2019-06-27T07:19:29.583 回答
0

将 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 中的 __ 仅用于更改名称它没有其他意义

于 2020-06-07T16:07:40.990 回答