我的 NAS 上有一个音乐卷,其中包含大量 CD。文件名通常为 01.name.mp3、02.name.mp3 等。在 NAS 的另一部分,我存储了每天每小时拍摄并命名的快照 00-00-00.jpg、01-00-00.jpg……23-00-00.jpg 我制作了一个 crontab 来在早上 7 点之前删除快照,因为它们通常很暗,所以保留它们没有意义。
好吧,你猜怎么着,我忘了快照文件夹中有一个指向音乐文件的链接。所以过了一会儿,我意识到从 01-name.mp3 到 07-name.jpg 的大多数音乐文件都被删除了。我试图做的是评估损坏程度并仅显示包含以 09-name.mpg 开头的文件且不包含 01-name.mp3 的目录。此文件夹(或 cd)已删除低于 07 的文件。
理想情况下,在搜索过程中,我希望消除任何其他包含非数字名称(如“main-theme.mp3”)的目录,因为我知道这些文件夹是完整的。
我确实尝试过:
find . -name "09*" -a ! -name "01*"
但没用。我也试过这个,但没有用
find . -mindepth 2 -maxdepth 2 -type d '!' -exec test -e "{}/01*" ';' -print
我的系统:
Linux fut-NUC7i3BNH 4.15.0-96-generic #97-Ubuntu SMP Wed Apr 1 03:25:46 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
答案1
下一个命令
- 查找包含以 开头的文件的所有唯一文件夹
09*
- 查找包含以 开头的文件的所有唯一文件夹
01*
01*
从指向文件的输出中删除指向文件的行09*
。
文件数量09*
应该大于01*
文件数量,因为其中一部分已被删除,所以该命令将只输出01*
已删除文件的文件夹。
snpath=$(echo ~/test/snapshots/) && \
find $snpath -name "09*" | sed 's|\(.*\)/.*|\1|' | sort | uniq > allf.txt && \
find $snpath -name "01*" | sed 's|\(.*\)/.*|\1|' | sort | uniq > notallf.txt && \
grep -Fvxf notallf.txt allf.txt | grep -oP "^$snpath\K.*"
$ snpath=$(echo ~/test/snapshots/)
snapshots
-文件夹的完整路径find $snpath -name "09*"
查找所有以 09 开头的文件及其完整路径sed 's|\(.*\)/.*|\1|'
删除文件名,仅留下父目录路径sort | uniq
删除重复的路径行,仅留下唯一的目录名称find $snpath -name "01*" | sed 's|\(.*\)/.*|\1|
查找我们不想看到的不需要的目录(它们不包含已删除的文件)grep -Fvxf notallf.txt allf.txt
从所有文件夹列表中删除不需要的文件夹名称,只留下包含09*
文件名称和不包含01*
文件名称的文件夹awk 'NR==FNR{a[$0];next} !($0 in a)' notallf.txt allf.txt
可以代替之前的grep
命令grep -oP "^$snpath\K.*"
输出快照文件夹的路径$ tree ./ ./ ├── allf.txt ├── Alligator Records 20th Anniversary Collection │ ├── CD1 │ │ ├── 01 - Hound Dog Taylor And The Houserockers .mp3 │ │ ├── 02 - James Cotton - No Cuttin Loose.mp3 │ │ ├── 03 - Black Cat Bone .mp3 │ │ ├── 04 - Professor Longhair - Big Chief.mp3 │ │ ├── 05 - Koko Taylor - Thats Why Im Crying.mp3 │ │ ├── 06 - Tinsley Ellis - Double-eyed Whammy.mp3 │ │ ├── 07 - Lucky Peterson - Im Free.mp3 │ │ ├── 08 - A.C. Reed-Stevie Ray Vaughan mp3 │ │ ├── 09 - Little Charlie And The Nightcats - Rain.mp3 │ │ └── file1 │ ├── CD2 │ │ ├── 09 - Bessie Smith,Moan, You Moaners.mp3 │ │ ├── 10 - Louis Armstrong,Nobody Knows The Trouble Ive Seen.mp3 │ │ ├── 11 - Golden Gate Quartet,The Valley Of Time.mp3 │ │ └── 12 - Golden Gate Quartet,The Sun Didnt Shine.mp3 │ └── file2 ├── file └── notallf.txt 3 directories, 18 files
结果:
$ snpath=$(echo ~/test/snapshots/) && find $snpath -name "09*" | sed 's|\(.*\)/.*|\1|' | sort | uniq > allf.txt && find $snpath -name "01*" | sed 's|\(.*\)/.*|\1|' | sort | uniq > notallf.txt && grep -Fvxf notallf.txt allf.txt | grep -oP "^$snpath\K.*"
Alligator Records 20th Anniversary Collection/CD2
答案2
您可以分两步完成:查找包含名称编号 1 的目录,然后在输出目录中查找包含名称编号 2 的目录。
例子:
find . -name "09* > output_first_search
cat output_first_search | grep "01*"