Linux在目录

时间:2017-11-17 19:41:48

标签: linux rename file-rename

我有以下命令,我运行小写文件/目录,替换。用_和各种其他操作。它的问题是它似乎首先尝试重命名目录,然后它找不到它下面的文件。有没有办法重命名目录中的所有文件然后递归地重命名目录本身? e.g。

  • directory1中
    • 文件1
    • file2的
    • directory1中
      • 文件1
      • file2的
    • directory2
      • 文件1
  • directory2
    • 文件1
    • file2的

我的代码是

while IFS= read -rd '' entry; do
   entry="${entry#./}"         # strip ./
   if [[ -d $entry ]]; then
      rename  'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   else
      rename  'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g;  s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   fi
done < <(find . -iname '*' -print0)

3 个答案:

答案 0 :(得分:0)

以下是使用递归的示例UNTESTED代码:

recurse()
{
for entry in "$1"/*; do
   entry="${entry#./}"         # strip ./
   if [[ -d $entry ]]; then
      recurse $entry
      rename  'y/A-Z/a-z/; s/ /_/g; s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   else
      rename  'y/A-Z/a-z/; s/\.(?=.*\.)/_/g; s/ /_/g;  s/_-_/-/g; s/sometext//g; s/_extras/-extras/g' "$entry"
   fi
done
}

recurse "/home"

答案 1 :(得分:0)

你看过this answer?  你的场景更复杂,但看起来他们在递归方面遇到了同样的困难。

答案 2 :(得分:0)

我正想着这条路上的东西:

find /path |awk -F/ '{print NF,$0}' |sort -r -n -k 1 |cut -f2- -d' ' |\
  while IFS= read -rd '' entry; do
    # ...
  done

这个想法是在每行前面加上/的数字,然后根据这个字段反向排序:

  

4 / path / dir1 / file1
  4 / path / dir2 / file2
  3 / path / dir1
  3 / path / dir2
  2 /路径

然后切掉第一列。这样,您可以自下而上地处理条目,以避免重命名问题。