在Linux中根据目录内文件数量重命名目录

5
我有以下布局: ``` d1 ├── f1 ├── f2 └── f3 d2 ├── f4 └── f5 d3 ├── f6 ├── f7 ├── f8 └── d4 └── f9 ``` 我想要的是将根目录重命名为包含其中所有文件(递归计算)的数量。 格式不是特别重要,只要不太长就行。我希望能每小时运行一次这个脚本以更新目录名称,所以第一次运行后,它应该如下所示: ``` 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

那是 ls -l 还是 ls -1?通常来说,可靠地解析 ls 命令的输出是一项危险(或至少是困难)的任务;请谨慎处理。 - Jonathan Leffler
2个回答

3

之前

.
├── 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

0

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

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

如果目录中存在数字,则将数字从目录名称中删除,这样我们可以多次重新运行此命令,而不会得到像2-3-dir这样的名称,并且检查newdirname是否与CURDIR相同;如果相同,则没有运行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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接