Dateien mit bestimmten Attributen finden, sie in ihren Verzeichnisnamen umbenennen, sie an einen anderen Ort kopieren

Dateien mit bestimmten Attributen finden, sie in ihren Verzeichnisnamen umbenennen, sie an einen anderen Ort kopieren

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

verwandte Informationen