
Es sieht nicht so aus, aber ich habe mehr als 3 Stunden damit verbracht, das herauszufinden ... Ich versuche, Dateien in allen Unterverzeichnissen eines übergeordneten Verzeichnisses mit bestimmten Attributen (Name und Größe) zu identifizieren, die Dateien dann in ihren Unterverzeichnisnamen umzubenennen und sie in das übergeordnete Verzeichnis zu kopieren. Mein nächster Versuch (glaube ich) war:
find /data/data2/parent/ -size 25166176c -name "o*.nii" -exec cp {} $subdir/o*.nii $subdir.nii \;
Daraufhin erhalte ich zwei Zeilen: „cp: Ziel ‚/data/data2/parent/3145_V2.nii‘ ist kein Verzeichnis“. Ich habe überprüft, ob es nur eine Datei gibt, die beide Attribute erfüllt, und das ist der Fall. Bemerkenswert ist auch, dass es unter „parent/“ zwei Unterverzeichnisse mit einer relevanten Datei gibt, die vom Befehl „find“ abgerufen werden sollte, aber der Fehler wurde nur für eines der beiden Verzeichnisse ausgegeben, „parent/3145_v2“ (und das andere Unterverzeichnis wurde scheinbar ignoriert).
Antwort1
Ich habe eine Regel, die ich gerne befolge: Wenn ich mehr als 30 Minuten mit der Konstruktion eines einzelnen Befehls in Bash verbringe, wechsele ich zu Python 3.
Dieses Problem könnte in Python leicht gelöst werden:
#/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')
Im Allgemeinen ist Python möglicherweise weniger Plug-and-Play als Bash-Tools, hat aber den Vorteil, dass es sehr gut dokumentiert und ziemlich fehlerfrei ist. Nur meine zwei Cent.
Sie können das obige Skript gerne verwenden. Ich habe es getestet und es funktioniert einwandfrei. Prost :)