许多研究已经转过了几乎相似的问题,但没有足够接近的问题,无法让我了解如何完成我的任务。我将尽量保持清晰和简短的态度,同时解释情况和期望的结果。我的结构如下:
-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"
,以检查在运行"真实"之前将要删除的内容