У меня есть куча загруженных файлов .root на моем ноутбуке, но мне нужны только определенные

У меня есть каталог с 10000 .root файлами (каждый из которых выглядит как hists11524_blinded.root или hists9899_blinded.root), и мне нужно запустить несколько макросов для целей анализа данных. Однако мне не нужно, чтобы все файлы (всего 4000) находились в каталоге. У меня есть список необходимых прогонов (эти 4000 номеров) в thebest.txt file. Этот файл также находится в той директории с гистограммами.

Я хочу удалить файлы, которые не нужны для обработки, перед запуском макросов, используя информацию из файла .txt.

Вот так выглядит файл thebest.txt:

   09769 
   09772 
   09773 
   09776 
   09777 
   09781 
   09782  
   09785  
   09786  
   09789  
   09790
   09793
    ...

Я предполагаю, что нужно работать с командой:

-comm -2 -3 <(ls) <(sort thebest) | tail +2 | xargs -p rm

Я получаю 2 ошибки:

tail: invalid option -- 'p'
sort: cannot read: No such file or directory 

Файл thebest.txt содержит только 5-значные числа, такие как 09999 или 11256, каталог содержит файлы с именами, такими как hists9999_blinded.root или hists11256_blinded.root.

Количество цифр в обоих списках разное - в этом основная проблема.

Как именно называются файлы? Пожалуйста, покажите несколько примеров. Чего вы хотите достичь? Поскольку вы используете команду rm, я предполагаю, что вы хотите удалить некоторые файлы. Какие файлы на основе номеров в thebest.txt и существующих файлов следует удалить? Пожалуйста, редактировать свой вопрос и добавьте недостающую информацию или уточнение. Если ваш файл называется thebest.txt, вы должны указать именно это имя как sort thebest.txt вместо thebest без .txt. Вы должны проверить свою команду шаг за шагом, например. comm -2 -3 <(ls) <(sort thebest.txt) сначала, затем добавьте | tail +2 и т.д.

Bodo 02.07.2019 15:40

Имя файлов ``` hists1000_blinded.root ```. У меня их 10000 в каталоге, но мне нужно запустить макрос только для 4000 из них. Номера этих 4000 гистограмм находятся в файле thebest.txt. Я хочу запустить команду, которая удалит другие 6000, которые мне не нужны, из каталога. Правда, я забыл поместить .txt в команду, но это все равно не работает.

sonic 02.07.2019 15:51
Пожалуйста, редактировать свой вопрос и добавьте эту информацию вместо ответа в комментарии. Можем ли мы предположить, что все числа в thebest.txt состоят из 5 цифр (при необходимости с ведущим 0)? Файл с именем hists1000_blinded.root не соответствует пятизначным числам. Будет ли thebest.txt содержать 1000 или 01000, чтобы соответствовать этому файлу? Или файл на самом деле называется hists01000_blinded.root? Совет по форматированию: используйте одну обратную кавычку вместо трех, чтобы получить встроенный фрагмент кода.
Bodo 02.07.2019 16:14

Я отредактировал его, как смог. Все числа в thebest.txt состоят из 5 цифр (они не начинаются с 1, они начинаются с 09769). Каталог содержит .root файлы с именами hists9769_blinded.root или hists11526_blinded.root. Проблема в том, что количество цифр не совпадает.

sonic 02.07.2019 16:37

@Bodo извините за пример с 1000, я торопился

sonic 02.07.2019 16:39

Еще раз: пожалуйста, добавьте все разъяснения, которые вы написали, в свои комментарии на вопрос. Основная проблема заключалась не в самом примере с 1000, а в недостающих пояснениях по поводу цифр. Могут ли быть также числа с менее чем 4-мя цифрами в именах файлов? (Например, когда вы начинаете сначала.)

Bodo 02.07.2019 16:46

нет, 4 минимум, 5 максимум. В файле .txt все номера имеют фиксированные 5 цифр.

sonic 02.07.2019 16:57
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из вариантов — удалить ведущие 0 из чисел, чтобы они соответствовали именам файлов. Чтобы избежать совпадения подстрок, вы можете добавлять и добавлять соответствующие части имени файла. (В вашем случае с номером в середине имени файла.)

Поскольку неясно, являются ли начальные пробелы в образце файла thebest.txt преднамеренными или это проблема форматирования, начальные пробелы также будут удалены.

Поскольку удаление неправильных файлов может привести к потере данных, вы также можете рассмотреть возможность обработки только совпадающих файлов вместо удаления не совпадающих файлов.

# remove leading spaces followed by leading zeros and prepend/append file name parts
sed 's/ *0*\([1-9][0-9]*\)/hists\1_blinded.root/' thebest.txt > thebestfiles.txt

# get matching files and process
find . -name 'hists*_blinded.root' | fgrep -f thebestfiles.txt | xargs process_matching

# or get non-matching files and remove
find . -name 'hists*_blinded.root' | fgrep -v -f thebestfiles.txt | xargs rm

Команда find выполняет рекурсивный поиск в текущем каталоге. Если вы хотите исключить подкаталоги, вы можете использовать -maxdepth 1. Чтобы избежать обработки имен каталогов, вы также можете добавить -type f.

@KristinaMikhailova Если это сработает, вы можете принять ответ.

Bodo 09.07.2019 08:51

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