根据大小将目录中的文件排序到子目录中

根据大小将目录中的文件排序到子目录中

所以我有一个充满文件(文本文件)的目录。我想根据文件大小将它们分类到不同的子目录中。

例如,如果它大于1MB->large_files。如果其小于1MB->small_files

我希望能够更改目录路径(输入/目标),它将自动创建子目录(如果它们不存在)。

我对如何处理这个问题感到非常困惑。

谢谢

答案1

也许是这样的脚本:

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1048576} # bytes

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find . ! -name . -prune -type f '(' \
  -size "+${cutoff}c" -exec sh -c 'exec mv -- "$@" large_files' sh {} + -o \
                      -exec sh -c 'exec mv -- "$@" small_files' sh {} + ')'

在 GNU 系统上,您可以将-v选项传递给mvmkdir使其更加详细。使用 GNU 工具,可以简化为:

#! /bin/sh -
dir=${1?Please specify the directory to sort}
cutoff=${2:-1M}

cd -P -- "$dir" || exit
mkdir -p -- small_files large_files || exit

find . -maxdepth 1 -type f '(' \
  -size "+$cutoff" -exec mv -t large_files {} + -o \
                   -exec mv -t small_files {} + ')'

使用该-t选项来指定目标目录,我们不再需要调用在 的参数sh中间插入文件名列表。mv

您可以添加更多类别,例如:

find . -maxdepth 1 -type f '(' \
  -size +1M   -exec mv -t large_files  {} + -o \
  -size +100k -exec mv -t medium_files {} + -o \
              -exec mv -t small_files  {} + ')'

使用zsh,您还可以这样做:

#! /bin/zsh -
dir=${1?Please specify the directory to sort}


cd -P -- "$dir" || exit

for size target (
  LG+1   huge_files
  LM+100 very_large_files
  LM+1   large_files
  LK+100 medium_sized_files
  L+100  small_files
  ''     tiny_files
) {
  mkdir -p $target || exit
  files=(*(NDoN.$size))
  (($#files == 0)) || mv -- $files $target || exit
}

答案2

not= && while :; do 
 while IFS= read -r -d '' f; do 
  [[ -z "${not}" ]] && target="large_files" || target="small_files"
  [[ ! -d "${target}" ]] && mkdir "${target}" 
  mv "${f} "${target}/${f}"
 done < <(find . -maxdepth 1 -type f ${not} -size +1000k -printf "%f\0" 2>/dev/random)
 [[ -n "${not}" ]] && break 
 not=!
done

for循环动态地将查找大小从大于 1M 更改为小于或等于 1M。错误被重定向到/dev/random(假设您在 Linux 上,添加到熵 -/dev/null如果没有,请将其更改为/dev/random)。

目标目录在设置之前更改为large_files ${not},如果目标目录不存在,则创建目标目录。下一次迭代设置${not}!并查找不大于 1M(小于或等于)的文件,并且同样创建目录small_files(如果该目录尚不存在)。

文件被移动到相应的目录中。

第一次设置后not,内部循环逻辑再次运行,not然后循环被打破。

注意:空字节用于 while 循环处理,因为它更稳健,IFS=取消设置用于处理空字节分隔列表的内部字段分隔符,并将-d ''分隔符设置为空字节,-r保护反斜杠不被剥离/解释。

相关内容