如何递归移动文件夹?

时间:2010-11-24 07:41:26

标签: bash

我正在尝试做这样的事情来删除所有目录和子目录中的空格。这是我的代码;

find /var/www/ -name "*" -type d | while read dir; do
  mv "$dir" `echo "$dir" | tr ' ' '.'`;
done

这可以工作,但一次只能按照每个目录。除非我多次重新运行脚本,否则它不适用于子目录。如果你们知道一个更好的方法,这样它也可以在子目录上工作,请告诉我。

之间,当我运行此脚本时,它将例如“This is directory one”之类的目录转换为“This.is.directory.one”。但是,如果我像我说的那样多次重新运行脚本,那么具有间隔文件夹名称的子目录不会改变。

4 个答案:

答案 0 :(得分:1)

这应该正常工作。

find . -depth -type d -name '* *' -exec bash -c 'dir="${1%%/}";d1="${dir%/*}";d2="${dir##*/}";mv "$1" "$d1/${d2// /.}"' -- {} \;

我们正在进行深度优先搜索,这意味着目录内容在它们所在的目录之前得到处理。我们只包含名称中带有空格的目录。然后我们有一个小的bash例程,使用参数替换,从路径中删除尾部斜杠,将路径分成两部分(目录名称(d2)和该目录的路径(d1)),然后mv是原始完整路径和名称到同一路径,但名称中的空格替换为句点。

答案 1 :(得分:1)

与Sorpigal的答案类似,但由于-execdir的使用而略显简单:

find . -depth -mindepth 1 -type d -name "* *" -execdir bash -c 'old="{}"; new=${old// /.}; mv "${old##*/}" "$new"' \;

答案 2 :(得分:0)

find ~/my/path -type f -name "*(J)*.*" -exec mv {} ~/my/path/j \;

https://superuser.com/questions/103151/recursive-move-files-of-specific-type-to-a-specific-path

答案 3 :(得分:0)

你应该为你的find命令添加“depth”标志:它会导致find(1)执行深度优先遍历。在 FreeBSD 中,它是 -d 。对不起,我在Linux发行版中不记得相同名称,请查看 find(1)了解详情。

find -d $dir -type d|  while read dir; do
  mv "$dir" `echo "$dir" | tr ' ' '.'`;
done
相关问题