파일 이름에 파일의 하위 디렉터리 이름을 추가하고 싶습니다.
다음은 디렉토리 트리입니다.
├── 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