它看起来不像,但我花了 3 个多小时试图解决这个问题...我试图识别具有特定属性(名称和大小)的父目录的所有子目录中的文件,然后将文件重命名为他们的子目录名称并将它们复制到父目录。我最接近的尝试(我认为)是:
find /data/data2/parent/ -size 25166176c -name "o*.nii" -exec cp {} $subdir/o*.nii $subdir.nii \;
为此,我得到两行:“cp:目标'/data/data2/parent/3145_V2.nii'不是目录”我检查以确保只有一个文件满足这两个属性,并且确实存在。另外值得注意的是,“parent/”下有两个子目录,其中包含一个相关文件,应通过 find 命令拾取这些文件,但它只打印与两个子目录之一“parent/3145_v2”有关的错误(并且似乎忽略了另一个子目录) )。
答案1
我有一个喜欢遵循的规则——如果我花费超过 30 分钟在 bash 中构建单个命令,我就会切换到 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 工具,但它的优点是文档丰富且几乎没有错误。只是我的两分钱。
请随意使用上面的脚本,我测试了它,它工作得很好。干杯:)