Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 对文件进行计数,如果计数大于给定的限制,则删除剩余的文件_Linux_Bash_Shell - Fatal编程技术网

Linux 对文件进行计数,如果计数大于给定的限制,则删除剩余的文件

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

我使用下面的脚本递归地计算目录中的文件数。在每个子目录中,如果计数大于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
        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