список базовых файлов в папке с многочисленными датами версий файла - PullRequest
0 голосов
/ 22 апреля 2019

У меня есть папка с многочисленными версиями файлов (тысячи из них), каждая с уникальной отметкой даты / времени в качестве расширения файла.Например:

./one.20190422
./one.20190421
./one.20190420
./folder/two.txt.20190420
./folder/two.txt.20190421
./folder/folder/three.mkv.20190301
./folder/folder/three.mkv.20190201
./folder/folder/three.mkv.20190101
./folder/four.doc.20190401
./folder/four.doc.20190329
./folder/four.doc.20190301

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

./one
./folder/two.txt
./folder/folder/three.mkv
./folder/four.doc

Я пришел с приведенным ниже кодом, но мне интересно, есть ли лучший, более эффективный способ.

# find all directories
find ./ -type d | while read folder ; do

    # go into that directory
    # then find all the files in that directory, excluding sub-directories
    # remove the extension (date/time stamp)
    # sort and remove duplicates
    # then loop through each base file

    cd "$folder" && find . -maxdepth 1 -type f -exec bash -c 'printf "%s\n" "${@%.*}"' _ {} + | sort -u | while read file ; do

        # and find all the versions of that file
        ls "$file".* | customFunctionToProcessFiles

    done    
done

Если это имеет значение, конечная цель - найти все версии определенного файла в группах базового файла и обработать их для чего-либо.Поэтому я планировал получить базовые файлы, затем просмотреть список и найти все файлы версий.Итак, снова используя приведенный выше пример, я сначала обработаю все файлы one.*, затем файлы two.* и т. Д.

Есть ли лучший, более быстрый и / или более эффективный способчтобы сделать это?

Некоторые примечания:

  • Возможно, есть тысячи файлов.Я знаю, что могу просто искать все файлы из корневой папки, удалять расширение даты / времени, сортировать и получать уникальные данные, но, поскольку может быть тысячи файлов, я подумал, что может быть более эффективным циклически проходить по каталогам.
  • Расширение файла с отметкой даты / времени не находится под моим контролем и не всегда может быть просто цифрами.Единственное, что я могу гарантировать, это конец периода.И независимо от того, в каком формате дата / время, все файлы будут делиться им - не будет некоторых файлов с одним форматом и других файлов с другим форматом.

1 Ответ

0 голосов
/ 22 апреля 2019

Вы можете использовать find ./ -type f -regex для прямого поиска файлов

find ./ -type f -regex '.*\.[0-9]+'
./some_dir/asd.mvk.20190422                                                                                                                                                                                                                                                 
./two.txt.20190420

Кроме того, передайте результат в вашу функцию через xargs без необходимости while циклов

re='(.*)(\.[0-9]{8,8})'
find ./ -type f -regextype posix-egrep -regex "$re" | \
sed -re "s/$re/\1/" | \
xargs -r0 customFunctionToProcessFiles
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...