Regex 根据Linux中的文件数重命名目录
我的布局如下:Regex 根据Linux中的文件数重命名目录,regex,linux,bash,rename,Regex,Linux,Bash,Rename,我的布局如下: 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
- 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
#!/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
之前
在顶级目录下运行该命令
之后
我就是这样做的。我循环遍历
$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
那是
ls-l
还是ls-1
?通常,可靠地解析ls
输出是一项危险(或至少是困难)的工作;小心点。
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
#!/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