busque archivos con atributos particulares, cámbieles el nombre a su nombre de directorio, cópielos en otro lugar

busque archivos con atributos particulares, cámbieles el nombre a su nombre de directorio, cópielos en otro lugar

No lo parecerá, pero he pasado más de 3 horas tratando de resolver esto... Estoy tratando de identificar archivos en todos los subdirectorios de un directorio principal con atributos particulares (nombre y tamaño) y luego cambiar el nombre de los archivos a su nombre de subdirectorio y cópielos en el directorio principal. Mi intento más cercano (creo) ha sido:

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

A esto, me salen dos líneas de: "cp: target '/data/data2/parent/3145_V2.nii' no es un directorio". Verifiqué para asegurarme de que solo haya un archivo que cumpla con ambos atributos, y lo hay. También es digno de mención que hay dos subdirectorios en "parent/" con un archivo relevante que debe ser seleccionado por el comando de búsqueda, pero solo imprimió el error con respecto a uno de los dos, "parent/3145_v2" (y parecía ignorar el otro subdirectorio ).

Respuesta1

Tengo una regla que me gusta seguir: si paso más de 30 minutos trabajando en la construcción de un solo comando en bash, cambio a Python 3.

Este problema podría resolverse fácilmente en 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')  

En general, Python puede ser menos plug-n-play que las herramientas bash, pero tiene la ventaja de estar muy bien documentado y bastante libre de errores. Sólo mis dos centavos.

Siéntete libre de utilizar el script anterior, lo probé y funciona bien. Salud :)

información relacionada