サブディレクトリ名でディレクトリのファイル名を変更したいと思います。

サブディレクトリ名でディレクトリのファイル名を変更したいと思います。

ファイル名にファイルのサブディレクトリ名を追加したいと思います。

以下はディレクトリツリーです。

├── 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

ディレクトリが変更されていない場合は、次の操作を行います。もちろん、これは可能な方法の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

おすすめ記事