![我想用子目录的名称重命名目录中的文件](https://linux22.com/image/213026/%E6%88%91%E6%83%B3%E7%94%A8%E5%AD%90%E7%9B%AE%E5%BD%95%E7%9A%84%E5%90%8D%E7%A7%B0%E9%87%8D%E5%91%BD%E5%90%8D%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我想将文件的子目录名称附加到其文件名中。
这是目录树:
├── 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