Linux: рекурсивно найти все .txt файлы, которые не имеют .tif - PullRequest
0 голосов
/ 24 ноября 2018

Я использую Debian Linux.Я новичок.Я сделаю все возможное, чтобы спросить самым простым из известных мне способов.

У меня есть довольно глубокое дерево каталогов на диске, которое содержит тысячи файлов .tif и .txt.Я хотел бы рекурсивно найти (перечислить) все файлы .txt, которые не имеют соответствующий файл .tif (базовое имя).Файлы .tif и .txt также расположены в отдельных каталогах по всему дереву.

В простом виде это может выглядеть следующим образом ...

directory1: hf-770.tif, hf-771.tif, hf-772.tif

directory2: hf-770.txt, hf-771.txt, hf-771.txt, hr-001.txt, tb-789.txt

Мне нужно найти (список) hr-001.txt и tb-789.txt, поскольку у них нет соответствующего файла .tif.Опять же, дерево каталогов довольно глубокое с несколькими подкаталогами.

Я исследовал и экспериментировал с вариантами следующих команд, но, похоже, не могу заставить его работать.Большое вам спасибо.

find -name "*.tif" -name "*.txt" | ls -1 | sed 's/\([^.]*\).*/\1/' | uniq

1 Ответ

0 голосов
/ 24 ноября 2018

Вы можете написать сценарий оболочки для этого:

#!/bin/bash
set -ue
while IFS= read -r -d '' txt
do
    tif=$(basename "$txt" | sed s/\.txt$/.tif/)
    found=$(find . -name "$tif")
    if [ -z "$found" ]
    then
        echo "$txt has no tif"
    fi
done < <(find . -name \*.txt -print0)

У него есть цикл для всех .txt файлов, которые он находит в текущем каталоге или ниже.Для каждого найденного файла он заменяет расширение .txt на .tif, а затем пытается найти этот файл.Если он не может его найти (возвращаемый текст пуст), он печатает .txt имя файла.

robert@saaz:$ tree
.
├── bar
│   └── a.txt
├── foo
│   ├── a.tif
│   ├── b.tif
│   ├── c.tif
│   └── d.txt
└── txt-without-tif

2 directories, 6 files
robert@saaz:$ bash txt-without-tif
./foo/d.txt has no tif
...