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