特定の属性を持つファイルを見つけて、そのディレクトリ名に名前を変更して別の場所にコピーします。

特定の属性を持つファイルを見つけて、そのディレクトリ名に名前を変更して別の場所にコピーします。

そうではありませんが、この問題を解決するために3時間以上費やしました...特定のプロパティ(名前とサイズ)を使用して、親ディレクトリのすべての子ディレクトリにあるファイルを識別し、名前を変更しようとしています。ファイルをサブディレクトリ名にコピーし、親ディレクトリにコピーします。私が試した最も近いものは次のとおりです。

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

これを行うには、「cp:target '/data/data2/parent/3145_V2.nii'はディレクトリではありません」という2行が表示されます。両方の属性を満たすファイルが1つしか存在しないことを確認しました。また、注目すべき点は、「parent /」の下にfindコマンドで選択する必要がある関連ファイルを含む2つのサブディレクトリがありますが、2つのサブディレクトリのうちの1つである「parent / 3145_v2」(および他のディレクトリ)に関連するエラーのみを印刷することです。です。サブディレクトリは無視されるようです))。

答え1

フォローしたいルールがあります。 bashで単一のコマンドを書くのに30分以上かかると、Python 3に切り替えます。

この問題は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')  

通常、Pythonはbashツールほどプラグアンドプレイではないかもしれませんが、よく文書化されており、バグがほとんどないという利点があります。私の2セント。

上記のスクリプトを自由に試してください。テストした結果、うまくいきます。乾杯:)

関連情報