Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在linux中如何递归地重命名目录和子目录?_Linux_Bash_Shell_Directory - Fatal编程技术网

在linux中如何递归地重命名目录和子目录?

在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级子目录的,对于多层次结构,是否有更干净的方法?欢迎提供任何其他单行命令建议/解决方案。当您希

假设我有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级子目录的,对于多层次结构,是否有更干净的方法?欢迎提供任何其他单行命令建议/解决方案。

当您希望在文件/目录中执行递归操作时,有两个选项:

选项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' '{}' \;