У меня есть куча загруженных файлов .root на моем ноутбуке, но мне нужны только определенные - PullRequest
0 голосов
/ 02 июля 2019

У меня есть каталог с 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.

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

1 Ответ

0 голосов
/ 02 июля 2019

Один из вариантов - удалить первые 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.

...