
Não vai parecer, mas passei mais de 3 horas tentando descobrir isso... Estou tentando identificar arquivos em todos os subdiretórios de um diretório pai com atributos específicos (nome e tamanho) e renomear os arquivos para seu nome de subdiretório e copie-os para o diretório pai. Minha tentativa mais próxima (eu acho) foi:
find /data/data2/parent/ -size 25166176c -name "o*.nii" -exec cp {} $subdir/o*.nii $subdir.nii \;
Para isso, recebo duas linhas de: "cp: target '/data/data2/parent/3145_V2.nii' is not a directory" Verifiquei para ter certeza de que há apenas um arquivo que atenderia a ambos os atributos, e existe. Também digno de nota, existem dois subdiretórios em "parent/" com um arquivo relevante que deveria ser obtido pelo comando find, mas ele apenas imprimiu o erro em relação a um dos dois, "parent/3145_v2" (e pareceu ignorar o outro subdiretório ).
Responder1
Tenho uma regra que gosto de seguir: se gastar mais de 30 minutos trabalhando na construção de um único comando no bash, mudo para o python 3.
Este problema pode ser facilmente resolvido em 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')
Em geral, o python pode ser menos plug-and-play do que as ferramentas bash, mas tem a vantagem de ser muito bem documentado e bastante livre de bugs. Apenas meus dois centavos.
Fique à vontade para usar o script acima, testei e funciona bem. Saúde :)