我正在尝试在 linux 系统上查找并重命名目录。
文件夹名称类似于:thefoldername-23423-431321
thefoldername
是一致的,但数字每次都在变化。
我试过这个:
find . -type d -name 'thefoldername*' -exec mv {} newfoldername \;
该命令实际上有效并重命名该目录。但是我在终端上收到一个错误,说没有这样的文件或目录。
我该如何解决?
-depth
这是一个无害的错误,您可以通过该选项摆脱它。
find . -depth -type d -name 'thefoldername*' -exec mv {} newfoldername \;
Find 的正常行为是处理目录,然后递归到其中。由于您已将其重命名,因此在尝试递归时会发现抱怨。该-depth
选项告诉 find 先递归,然后再处理目录。
它缺少-execdir选项!如 find 的手册页所述:
-execdir command {};
类似 -exec
,但指定的命令是从包含匹配文件的子目录运行的,通常不是您开始查找的目录。
find . -depth -type d -name 'thefoldername*' -execdir mv {} newfoldername \;
使用上一个答案,我的文件夹内容消失了。
这是我的解决方案。它运作良好:
for i in
find -type d -name 'oldFolderName'
;
do
dirname=$(dirname "$i")
mv $dirname/oldFolderName $dirname/newFolderName
done
.../ABC -> .../BCD
find . -depth -type d -name 'ABC' -execdir mv {} $(dirname $i)/BCD \;
将 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 中的 __ 仅用于更改名称它没有其他意义