Как найти каталоги, содержащие два различных имен файлов?

У меня есть музыкальный объем на моем NAS, который содержит много CD. Именами файлов обычно является 01.name.mp3, 02.name.mp3 и т.д. На другой части NAS я храню снимки, взятые и именованные в каждый час дня 00-00-00.jpg, 01-00-00.jpg.... 23-00-00.jpg я сделал crontab для удаления снимков до 7:00, когда они были обычно темными, таким образом, никакой смысл в хранении их.

Хорошо угадайте то, что, у меня была ссылка в папке снимков, которую я забыл, указав на музыкальные файлы. Так через некоторое время я понял, что большинство моих музыкальных файлов от 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
задан 13 April 2020 в 21:13

2 ответа

Следующая команда

  • ищет все уникальные папки, содержащие файлы, запускающиеся с 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
0
ответ дан 25 April 2020 в 10:49

Можно сделать это на двух шагах: найдите каталоги, которые содержат имя номер один, затем находят в выходных каталогах, которые содержат имя номер 2.

Пример:

find . -name  "09* > output_first_search
cat output_first_search | grep "01*"
0
ответ дан 25 April 2020 в 10:49

Другие вопросы по тегам:

Похожие вопросы: