Linux 对文件进行计数,如果计数大于给定的限制,则删除剩余的文件
我使用下面的脚本递归地计算目录中的文件数。在每个子目录中,如果计数大于3,我需要删除剩余的文件 是否需要为每个子目录添加另一个for循环,如果超过3个,则删除其余文件Linux 对文件进行计数,如果计数大于给定的限制,则删除剩余的文件,linux,bash,shell,Linux,Bash,Shell,我使用下面的脚本递归地计算目录中的文件数。在每个子目录中,如果计数大于3,我需要删除剩余的文件 是否需要为每个子目录添加另一个for循环,如果超过3个,则删除其余文件 START=$HOME # change your directory to command line if passed # otherwise use home directory [ $# -eq 1 ] && START=$1 || : if [ ! -d $START ] then e
START=$HOME
# change your directory to command line if passed
# otherwise use home directory
[ $# -eq 1 ] && START=$1 || :
if [ ! -d $START ]
then
echo "$START not a directory!"
exit 1
fi
# use find command to get all subdirs name in DIRS variable
DIRS=$(find "$START" -type d)
# loop thought each dir to get the number of files in each of subdir
for d in $DIRS
do
[ "$d" != "." -a "$d" != ".." ] && echo "$d dirctory has $(ls -l $d | wc -l) files" || :
done
find
已经提供了START
下面的子目录数。由于包含PWD
(
),计数增加了1
。因此,要获得START
下面的子目录数,不包括START
本身:
find "$START" -type d | echo "subdirs: $(($(wc -l)-1))"
输出示例:
subdirs: 6
files: 128
$ bash del3dirs.sh
processing: /home/david/scr/tmp/stack/sav
num files: 5
keeping : /home/david/scr/tmp/stack/sav/dna.sh
keeping : /home/david/scr/tmp/stack/sav/dict-sort_1.sh
keeping : /home/david/scr/tmp/stack/sav/_20140702-211202.tar.xz
deleting: /home/david/scr/tmp/stack/sav/dict-sort.sh
deleting: /home/david/scr/tmp/stack/sav/dict-sort_2.sh
processing: /home/david/scr/tmp/stack/tmp
num files: 13
keeping : /home/david/scr/tmp/stack/tmp/File1950text.doc
keeping : /home/david/scr/tmp/stack/tmp/vcs1dump
keeping : /home/david/scr/tmp/stack/tmp/File2014text.xls
deleting: /home/david/scr/tmp/stack/tmp/File307list.cvs
deleting: /home/david/scr/tmp/stack/tmp/vcsa1dump
(snip)
processing: /home/david/scr/tmp/stack/tmp/a
num files: 2
keeping : /home/david/scr/tmp/stack/tmp/a/b/b.txt
keeping : /home/david/scr/tmp/stack/tmp/a/b/b.txt.bac
processing: /home/david/scr/tmp/stack/dat
num files: 68
keeping : /home/david/scr/tmp/stack/dat/outlier.dat
keeping : /home/david/scr/tmp/stack/dat/3line.dat.sav
keeping : /home/david/scr/tmp/stack/dat/f1f2.dat
deleting: /home/david/scr/tmp/stack/dat/datb.dat
deleting: /home/david/scr/tmp/stack/dat/lline.dat
deleting: /home/david/scr/tmp/stack/dat/vowels.txt
要获取文件数,只需使用-type f
(无需减去1):
输出示例:
subdirs: 6
files: 128
$ bash del3dirs.sh
processing: /home/david/scr/tmp/stack/sav
num files: 5
keeping : /home/david/scr/tmp/stack/sav/dna.sh
keeping : /home/david/scr/tmp/stack/sav/dict-sort_1.sh
keeping : /home/david/scr/tmp/stack/sav/_20140702-211202.tar.xz
deleting: /home/david/scr/tmp/stack/sav/dict-sort.sh
deleting: /home/david/scr/tmp/stack/sav/dict-sort_2.sh
processing: /home/david/scr/tmp/stack/tmp
num files: 13
keeping : /home/david/scr/tmp/stack/tmp/File1950text.doc
keeping : /home/david/scr/tmp/stack/tmp/vcs1dump
keeping : /home/david/scr/tmp/stack/tmp/File2014text.xls
deleting: /home/david/scr/tmp/stack/tmp/File307list.cvs
deleting: /home/david/scr/tmp/stack/tmp/vcsa1dump
(snip)
processing: /home/david/scr/tmp/stack/tmp/a
num files: 2
keeping : /home/david/scr/tmp/stack/tmp/a/b/b.txt
keeping : /home/david/scr/tmp/stack/tmp/a/b/b.txt.bac
processing: /home/david/scr/tmp/stack/dat
num files: 68
keeping : /home/david/scr/tmp/stack/dat/outlier.dat
keeping : /home/david/scr/tmp/stack/dat/3line.dat.sav
keeping : /home/david/scr/tmp/stack/dat/f1f2.dat
deleting: /home/david/scr/tmp/stack/dat/datb.dat
deleting: /home/david/scr/tmp/stack/dat/lline.dat
deleting: /home/david/scr/tmp/stack/dat/vowels.txt
您可以将这一切放在一起,同时将查找
文件的-maxdepth
限制为1
,并完成所需的操作注意:下面的脚本只打印它是将保留
还是删除
文件(保留每个目录中的前3个,删除其余的)。您需要实施自己的方案,保留/删除该方案以满足您的需要。这将让您了解您可以做什么:
#!/bin/bash
start="${1:-$PWD}"
[ -d "$start" ] || {
printf "error: directory not accessible '%s'\n", "$start"
exit 1;
}
declare -a files # declare an array to hold files
for i in $(find "$start" -type d); do # find all subdirs
[ "$i" = "$PWD" ] && continue # skip the current (top) dir
printf "\nprocessing: %s\n\n" "$i" # simple dir info output (not needed)
files=( $(find "$i" -maxdepth 1 -type f) ) # fill array w/files in each dir (no subs)
if [ "${#files[@]}" -gt 0 ]; then # if subdir has files
echo "num files: ${#files[@]}" # No. of files in dir info (not needed)
for ((j=0; j<${#files[@]}; j++)); do # for each file
if [ "$j" -lt 3 ]; then # if first 3, keep
printf " keeping : %s\n" "${files[j]}"
else # files 4+ delete
printf " deleting: %s\n" "${files[j]}"
fi
done
fi
done
感谢您的回答,我的目的是统计每个子目录中的文件数量,如果数量超过“3”,则删除剩余的文件。有可能吗?好的,给我一秒钟,我会帮你修改答案。非常感谢我正在检查:)效果很好,谢谢!!如果名称类似于“test(copy).txt”,则有一个条件除外。然后将其作为两个文件。您必须详细说明(张贴示例)。在
“test(copy).txt”
上不应进行扩展或分词。我来测试一下。哦,这些看起来不像普通的文件名字符。Bash抱怨说,除非对paren进行转义,否则会使用paren创建文件名。让我看看是否有快速解决办法。您使用的是什么操作系统?刚刚测试过,它在这里工作得很好:删除:/home/david/scr/tmp/stack/dat/tmp/b/text(copy).txt