![提取所有子目录中的最后 100 个文件,每个目录都有可变数量的文件](https://linux22.com/image/891918/%E6%8F%90%E5%8F%96%E6%89%80%E6%9C%89%E5%AD%90%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%9C%80%E5%90%8E%20100%20%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E6%AF%8F%E4%B8%AA%E7%9B%AE%E5%BD%95%E9%83%BD%E6%9C%89%E5%8F%AF%E5%8F%98%E6%95%B0%E9%87%8F%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个包含 6 个子目录的目录。每个子目录还包含数量不定的子目录。这些最后的目录包含数量不定的*.jpg
文件。jpg 文件的命名格式为0000.jpg
,0001.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
到你想要的路径。