하위 디렉터리 이름으로 디렉터리의 파일 이름을 바꾸고 싶습니다.

하위 디렉터리 이름으로 디렉터리의 파일 이름을 바꾸고 싶습니다.

파일 이름에 파일의 하위 디렉터리 이름을 추가하고 싶습니다.

다음은 디렉토리 트리입니다.

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

관련 정보