
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 :)