繁体   English   中英

根据Linux中的文件数重命名目录

[英]Rename directories based on number of files within in Linux

我有以下布局:

  • D1
    • F1
    • F2
    • F3
  • D2
    • F4
    • F5
  • D3
    • F6
    • F7
    • F8
    • D4
      • F9

我想要做的是重命名根目录以包含其中包含的(递归)文件的数量。 只要不太长,格式就不是非常重要。 我希望能够每小时左右以cron的身份运行此脚本来更新目录名称,因此在第一次运行后它将如下所示:

  • 3-D1
    • F1
    • F2
    • F3
  • 2-D2
    • F4
    • F5
  • 4-D3
    • F6
    • F7
    • F8
    • D4
      • F9

然后在第二次运行之后,可能会添加和删除更多文件,现在它看起来像这样:

  • 1-D1
    • F1
  • 4-D2
    • F2
    • F3
    • F4
    • F5
  • 10-D3
    • F6
    • F7
    • F8
    • D4
      • F9
      • F10
      • F11
      • F12
      • F13
      • F14
      • F15

到目前为止,我有以下bash脚本,但我无法弄清楚如何在文件名上进行正则表达式替换

#!/bin/bash

TARGETPATH=/home/pritchea/test
for CURDIR in `ls -l $TARGETPATH`
do
  if [ -d $TARGETPATH/$CURDIR ]; then
    echo "$CURDIR is a directory"
    FILECOUNT=`find $TARGETPATH/$CURDIR -type f | wc -l`
    echo " and there are $FILECOUNT file(s)";
  fi
done

之前

.
├── d1
│   ├── f1
│   ├── f2
│   └── f3
├── d2
│   ├── f4
│   └── f5
└── d3
    ├── d4
    │   └── f9
    ├── f6
    ├── f7
    └── f8

在顶级目录运行命令

cd /home/pritchea/test

for i in *
do
    [[ -d $i ]] || continue
    n=${i#*-}
    c=$(find "$i" -type f -printf x | wc -c)
    [[ $i == $c-$n ]] && continue
    mv -f "$i" "$c-$n"
done

.
├── 2-d2
│   ├── f4
│   └── f5
├── 3-d1
│   ├── f1
│   ├── f2
│   └── f3
└── 4-d3
    ├── d4
    │   └── f9
    ├── f6
    ├── f7
    └── f8

这就是我做的方式。 我遍历$TARGETPATH所有目录,使用ls -l检查每个$CURDIR中有多少个不是目录的文件。 注意:这可能不是最好的方法( find -f可能会给出更好的结果;我没有检查过符号链接等)。

因为wc -l倾向于给出类似于[ 1]输出,而不是[1] ,所以我使用sed空白。

从目录中删除该编号(如果存在),这样我们就可以多次重新运行它,而不是最终使用如下所示的名称: 2-3-dir ,并检查newdirnameCURDIR是否相同; 如果是的话,没有必要运行mv


#!/bin/bash

TARGETPATH=.
for CURDIR in `ls -l $TARGETPATH`
do
  if [ -d $TARGETPATH/$CURDIR ]; then
    echo "$CURDIR is a directory"
    #Also strip whitespace from FILECOUNT
    FILECOUNT=$(ls -l $CURDIR | grep ^- | wc -l | sed -e 's/[ \t]*//')
    echo " and there are $FILECOUNT file(s)";

    # We should remove the number from the directory.
    newdirname="$FILECOUNT"-"$(echo "$CURDIR" | sed -e 's/^[0-9]*-//')"
    echo " New directory name: ["$newdirname"]"
    # Now we move the old-dir to the new-dir. 
    if [[ "$CURDIR" != "$newdirname" ]]; then
    mv $TARGETPATH/$CURDIR $TARGETPATH/$newdirname
    fi  
  fi  
done

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM