在linux中如何递归地重命名目录和子目录?
假设我有200个目录,它有可变的层次结构子目录,如何使用mv命令和find或任何组合重命名目录及其子目录在linux中如何递归地重命名目录和子目录?,linux,bash,shell,directory,Linux,Bash,Shell,Directory,假设我有200个目录,它有可变的层次结构子目录,如何使用mv命令和find或任何组合重命名目录及其子目录 for dir in ./*/; do (i=1; cd "$dir" && for dir in ./*; do printf -v dest %s_%02d "$dir" "$((i++))"; echo mv "$dir" "$dest"; done); done 这是针对2级子目录的,对于多层次结构,是否有更干净的方法?欢迎提供任何其他单行命令建议/解决方案。当您希
for dir in ./*/; do (i=1; cd "$dir" && for dir in ./*; do printf -v dest %s_%02d "$dir" "$((i++))"; echo mv "$dir" "$dest"; done); done
这是针对2级子目录的,对于多层次结构,是否有更干净的方法?欢迎提供任何其他单行命令建议/解决方案。当您希望在文件/目录中执行递归操作时,有两个选项: 选项1:查找
while IFS= read -r -d '' subd;do
#do your stuff here with var $subd
done < <(find . -type d -print0)
选项2:使用Bash globstar选项
shopt -s globstar
for subd in **/ ; do
#Do you stuff here with $subd directories
done
在这种情况下,for循环将匹配当前工作目录下的所有子目录(操作***/
)
您还可以要求bash使用返回文件和文件夹
for sub in ** ;do #your commands;done
if [[ -d "$sub" ]];then
#actions for folders
elif [[ -e "$sub" ]];then
#actions for files
else
#do something else
fi
done
文件夹测试:
$ shopt -s globstar
$ for i in **/ ;do echo "$i";done
dir1/
dir1/sub1/
dir1/sub1/subsub1/
dir1/sub1/subsub1/subsubsub1/
dir2/
dir2/sub2/
在您的小脚本中,只需启用
shopt-s globstar
并将for更改为**/中的for dir;执行
这似乎可以像您期望的那样工作。我有一个特定的任务-替换目录和文件中的非ASCII符号和方括号。它很好用
首先,正是我的情况,作为一个工作示例:
find . -depth -execdir rename -v 's/([^\x00-\x7F]+)|([\[\]]+)/\_/g' {} \;
或单独使用非ascii和括号:
find . -depth -execdir rename -v 's/[^\x00-\x7F]+/\_/g' {} \;
find . -depth -execdir rename -v 's/[\[\]]+/\_/g' {} \;
如果我们只想使用目录,请添加-typed
(在-depth
选项之后)
现在,从更广义的角度来看:
find . -depth [-type d] [-type f] -execdir rename [-v] 's/.../.../g' '{}' \;
在这里,我们可以控制目录/文件和详细信息。您的计算机上可能需要或不需要{}周围的引号(前面是反斜杠;服务相同,可以用引号替换)您能用文字描述一下如何重命名目录吗?另外,你能在问题中添加一个目录树示例,并给出预期的最终状态吗?@aruns-Answer updated-修复了一些小问题并包括一些测试。如果此信息对您有帮助,请告诉我
find . -depth [-type d] [-type f] -execdir rename [-v] 's/.../.../g' '{}' \;