У меня есть музыкальный объем на моем 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
Следующая команда
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.
Пример:
find . -name "09* > output_first_search
cat output_first_search | grep "01*"