脚本以删除每个目录中最古老的类型文件

  • 本文关键字:文件 类型 删除 脚本 bash
  • 更新时间 :
  • 英文 :


许多研究已经转过了几乎相似的问题,但没有足够接近的问题,无法让我了解如何完成我的任务。我将尽量保持清晰和简短的态度,同时解释情况和期望的结果。我的结构如下:

-mobile  
--Docs  
--Downloads  
--SomeFile  
----this.is.crazy_0.0.1-1_named-silly.txt 
----dont.touch.me.pdf
----leave.me.alone.png 
----this.is.crazy_0.0.1-2_named-silly.txt  
----this.is.crazy_0.0.1-3_named-silly.txt <---- file to keep  
--SomeFileA  
----this.is.crazy_0.0.1-1_also-silly.txt  
----this.is.crazy_0.0.1-2_also-silly.txt
----dont.touch.me.either.pdf
----leave.me.alone.too.png  
----this.is.crazy_0.0.1-3_also-silly.txt  
----this.is.crazy_0.0.1-11_also-silly.txt <----file to keep  

我脚本的第一部分找到.txt文件忽略了此工作目录中的每个目录并将其打印到列表中(这是一个完全丑陋的hack,很可能是大多数人都能完成的方式的阻碍任务)" Somefileb和Somefilec"可能会带有相同的文件结构,我也想在此脚本中捕获它们。

这个想法是根据其时间戳将最新的.txt文件保留在每个目录中,这显然不在文件名中。保留的文件当然会继续改变。为了再次澄清这个问题,如何将最新的.txt文件保存在每个变量目录中,并根据不在文件名中的时间戳,以可变的疯狂名称保存?希望我已经足够清楚了。此脚本应该在bash中。

我现在不喜欢当前的代码,因为我说的丑陋,但我的 find /path/to/working/directory -maxdepth 0 -not -path "*Docs*" -not -path "*Downloads* -name "*.txt" >list

是一个摘要

假设该问题正确地理解,任务可以表示为:

递归删除所有文件*.txt,除每个相应目录中的最新文件

#!/bin/bash
# Find all directories from top of tree
find a -type d | while read -r dir; do
    # skip $dir if doesn't contain any files *.txt
    ls "$dir"/*.txt &>/dev/null || continue
    # list *.txt by timestamp, skipping the newest file
    ls -t "$dir"/*.txt | awk 'NR>1' | while read -r file; do
        rm "$file"
    done
done

假设这个目录树,其中 a.txt始终是最新的:

$ tree -t a
a
├── otherdir
├── b
│   ├── d e
│   │   ├── a.txt
│   │   ├── b.txt
│   │   ├── c.txt
│   │   ├── bar.txt
│   │   └── foo.pdf
│   ├── c
│   │   ├── a.txt
│   │   ├── b.txt
│   │   └── c.txt
│   ├── a.txt
│   ├── b.txt
│   ├── c.txt
│   └── foo.pdf
├── a.txt
├── b.txt
└── c.txt

这是运行脚本后的结果:

$ tree -t a
a
├── b
│   ├── c
│   │   └── a.txt
│   ├── d e
│   │   ├── a.txt
│   │   └── foo.pdf
│   ├── a.txt
│   └── foo.pdf
├── otherdir
└── a.txt

rm "$file"更改为echo rm "$file",以检查在运行"真实"之前将要删除的内容

相关内容

  • 没有找到相关文章

最新更新