Копирование файла из каталога большего размера в al oop bash - PullRequest
1 голос
/ 03 мая 2020

Заранее извиняюсь, если вопрос очень основательный c.

Мне нужно скопировать некоторые файлы из одного места в другое. Я пытаюсь написать скрипт в bash, который автоматизирует процесс. Чтобы сделать в oop, я использую список и шаблоны, потому что имена файлов не согласованы. То, что у меня есть (обратите внимание, что 'должно быть `):

for subject in cat 'subjects_list.txt' ; do
    cp /input/$subject/*_task/*_task-file.nii /output/$subject/dir1/${subject}_task-file.nii
done

Все это работает нормально, проблема в том, что иногда есть 2 каталога с именем' * _task 'в каталоге субъекта, с файл * _task-file.nii каждый. Однако один из этих файлов не является полным, но из-за подстановочного знака скрипт захватывает оба. Я хотел бы добавить в свой сценарий способ проверить, существует ли более одного каталога с именем task, и если это так, возьмите * _task-file.nii с большим размером (и откажитесь от другого - больший размер должен означать, что файл готов). Я знаю, что могу использовать wc -c $file для проверки размера файла. Однако я не знаю, какой был бы самый простой способ (мои bash знания довольно просты c), чтобы написать в моем сценарии только копию файла с большим размером. Если бы кто-то был рад указать мне правильное направление, чтобы я мог написать сценарий go, я был бы очень признателен.

Спасибо!

1 Ответ

0 голосов
/ 03 мая 2020

Какой самый простой способ (мои bash знания довольно просты c) написать в моем сценарии только копию файла с большим размером.

  • Печать файлов в виде списка с именем файла и размером stat.
  • sort списка по размеру.
  • Получить последний (или первый, в зависимости от порядка сортировки) элемент список. tail или head
  • Извлеките имя файла cut
  • Скопируйте этот элемент.

Что-то вместе:

file_with_greatest_size=$(
    stat -c '%s %n' /input/$subject/*_task/*_task-file.nii |
    sort -k1n |
    tail -n1 |
    cut -d' ' -f2-
)
cp "$file_with_greatest_size" /destination

# with xargs it could be just: 
#     | xargs -d'\n' -I{} cp {} /destination
# without a temporary variable

Примечания:

...