如何查找包含两个不同文件名的目录?

如何查找包含两个不同文件名的目录?

我的 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*"

相关内容