我想用子目录的名称重命名目录中的文件

我想用子目录的名称重命名目录中的文件

我想将文件的子目录名称附加到其文件名中。

这是目录树:

├── foo_nifti
│   ├──anatomical
│   │   ├──file_name.nii.gz
├──ba_nifti
│   ├──anatomical
│   │   ├──file_name.nii.gz

这是我正在使用的命令:

shopt -s globstar nullglob

files=(*nifti/anatomical/*nii.gz)

for pathname in *nifti/anatomical/*; do newname=${PWD}; mv "$pathname" "$newname"; done

这个命令没有给我我想要的。它将我所在目录的路径附加到文件名中,而不是将文件子目录的名称附加到文件名中。

我想要的输出

├── foo_nifti
│   ├──anatomical
│   │   ├──foo_nifti_file_name.nii.gz
├──ba_nifti
│   ├──anatomical
│   │   ├──ba_nifti_file_name.nii.gz

谢谢你!

答案1

如果目录没有更改,则执行以下操作。当然,这是可能的方式之一:

#!/usr/bin/env bash
# Use mapfile to store the found files in array 'a'
mapfile -t a < <(find . -type f -name '*.nii.gz' -printf '%P\n')

# Traverse through the array
for file in "${a[@]}"; do
  base="${file%%/*}"  # Retrieve the base dir of the file
  fname="${file##*/}" # Retrieve the file name only  
  # move original $file to 'dir/anatomical/dir_file_name  
  echo mv -v "$file" "${file%/*}/${base}_${fname}"
done

如果您想了解有关字符串操作的更多信息,请参阅:https://mywiki.wooledge.org/BashFAQ/100

结果看起来像这样:

renamed 'foo_nifti/anatomical/file_name.nii.gz' -> 'foo_nifti/anatomical/foo_nifti_file_name.nii.gz'
renamed 'bar_nifti/anatomical/file_name.nii.gz' -> 'bar_nifti/anatomical/bar_nifti_file_name.nii.gz'

如果您对结果满意,可以删除echo

相关内容