У меня есть каталог с 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
.
Количество цифр в обоих списках разное - в этом основная проблема.
Имя файлов ``` hists1000_blinded.root ```. У меня их 10000 в каталоге, но мне нужно запустить макрос только для 4000 из них. Номера этих 4000 гистограмм находятся в файле thebest.txt. Я хочу запустить команду, которая удалит другие 6000, которые мне не нужны, из каталога. Правда, я забыл поместить .txt в команду, но это все равно не работает.
thebest.txt
состоят из 5 цифр (при необходимости с ведущим 0)? Файл с именем hists1000_blinded.root
не соответствует пятизначным числам. Будет ли thebest.txt
содержать 1000
или 01000
, чтобы соответствовать этому файлу? Или файл на самом деле называется hists01000_blinded.root
? Совет по форматированию: используйте одну обратную кавычку вместо трех, чтобы получить встроенный фрагмент кода.
Я отредактировал его, как смог. Все числа в thebest.txt
состоят из 5 цифр (они не начинаются с 1, они начинаются с 09769). Каталог содержит .root
файлы с именами hists9769_blinded.root
или hists11526_blinded.root
. Проблема в том, что количество цифр не совпадает.
@Bodo извините за пример с 1000, я торопился
Еще раз: пожалуйста, добавьте все разъяснения, которые вы написали, в свои комментарии на вопрос. Основная проблема заключалась не в самом примере с 1000, а в недостающих пояснениях по поводу цифр. Могут ли быть также числа с менее чем 4-мя цифрами в именах файлов? (Например, когда вы начинаете сначала.)
нет, 4 минимум, 5 максимум. В файле .txt все номера имеют фиксированные 5 цифр.
Один из вариантов — удалить ведущие 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 Если это сработает, вы можете принять ответ.
Как именно называются файлы? Пожалуйста, покажите несколько примеров. Чего вы хотите достичь? Поскольку вы используете команду
rm
, я предполагаю, что вы хотите удалить некоторые файлы. Какие файлы на основе номеров вthebest.txt
и существующих файлов следует удалить? Пожалуйста, редактировать свой вопрос и добавьте недостающую информацию или уточнение. Если ваш файл называетсяthebest.txt
, вы должны указать именно это имя какsort thebest.txt
вместоthebest
без.txt
. Вы должны проверить свою команду шаг за шагом, например.comm -2 -3 <(ls) <(sort thebest.txt)
сначала, затем добавьте| tail +2
и т.д.