найти файлы с определенными атрибутами, переименовать их в соответствии с именем каталога, скопировать их в другое место

найти файлы с определенными атрибутами, переименовать их в соответствии с именем каталога, скопировать их в другое место

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

find /data/data2/parent/ -size 25166176c -name "o*.nii" -exec cp {} $subdir/o*.nii $subdir.nii \;

На это я получаю две строки: "cp: target '/data/data2/parent/3145_V2.nii' is not a directory" Я проверил, чтобы убедиться, что есть только один файл, который соответствует обоим атрибутам, и он есть. Также стоит отметить, что есть два подкаталога в "parent/" с соответствующим файлом, который должен быть выбран командой find, но она вывела ошибку только относительно одного из двух, "parent/3145_v2" (и, похоже, проигнорировала другой подкаталог).

решение1

У меня есть правило, которому я следую: если я трачу более 30 минут на создание одной команды в bash, я переключаюсь на Python 3.

Эту проблему можно легко решить на Python:

#/usr/local/bin/python3

import os, re

DIR_TO_SEARCH = os.getcwd()   #change this to what you want

for (dirpath, dirnames, filenames) in os.walk(DIR_TO_SEARCH):
    if dirpath == DIR_TO_SEARCH:
        # you said you just want subdirectories, so skip this
        continue
    else:
        for name in filenames:
            full_path = dirpath + '/' + name
            #check for the attributes you're looking for. Change this to your needs.
            if re.search(r'o*\.nii', name) or os.path.getsize(full_path) > 0:
                #rename the file to its directory's name, and move it to the parent dir
                print('Moving {} to {}'.format(full_path, dirpath + '.nii'))
                os.rename(full_path, dirpath + '.nii')  

В целом, python может быть менее plug-n-play, чем инструменты bash, но у него есть преимущество в том, что он очень хорошо документирован и практически не содержит ошибок. Просто мои два цента.

Можете смело использовать скрипт выше, я его протестировал, и он отлично работает. Ура :)

Связанный контент