ファイル名にファイルのサブディレクトリ名を追加したいと思います。
以下はディレクトリツリーです。
├── 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