提取所有子目录中的最后 100 个文件,每个目录都有可变数量的文件

提取所有子目录中的最后 100 个文件,每个目录都有可变数量的文件

我有一个包含 6 个子目录的目录。每个子目录还包含数量不定的子目录。这些最后的目录包含数量不定的*.jpg文件。jpg 文件的命名格式为0000.jpg0001.jpg等等。

我感兴趣的是获取最后 100 个*.jpg文件(所有目录都有 > 100 个文件),并将它们存储在与原始目录具有类似结构的单独目录中。

最好的做法是什么?

答案1

在包含 6 个子目录的父目录中:

mkdir ../newdirs

然后:

for d in */*; do mkdir -p ../newdirs/"$d"; i=0; j=$(stat "$d"/* --printf "%i\n" | wc -l); for f in "$d"/*; do [[ -f "$f" ]] && (( (j - ++i) < 100 )) && echo mv -v -- "$f" ../newdirs/"$d"; done; done

测试后删除echo以实际移动文件。
更易读:

for d in */*; do 
  mkdir -p ../newdirs/"$d" 
  i=0
  j=$(stat "$d"/* --printf "%i\n" | wc -l)
  for f in "$d"/*; do 
    [[ -f "$f" ]] && 
    (( (j - ++i) < 100 )) && 
      echo mv -v -- "$f" ../newdirs/"$d"
  done
done

笔记

  • mkdir ../newdirs为移动的文件创建一个与当前文件同级的新目录(即..两者的父目录)
  • for d in */*; do对于每个子子目录......
  • mkdir -p ../newdirs/"$d"在并行结构中创建一个目录,根据-p需要创建父目录并
  • i=0将变量设置为 0,用于计算迭代次数
  • j=$(stat "$d"/* --printf "%i\n" | wc -l)计算子目录中的文件数量,并将该数字分配给j
  • for f in "$d"/*; do对于子目录中的所有内容
  • [[ -f "$f" ]] &&如果它是一个文件
  • (( (j - ++i) < 100 )) &&如果目录中的文件数减去循环运行的次数小于 100,那么……
  • mv -v -- "$f" ../newdirs/"$d"将文件移动到新结构中的相应目录中。

for按顺序迭代文件,因此此方法将按数字列出最后 100 个文件。

你可以调整../newdirs到你想要的路径。

相关内容