부분 디렉터리 이름을 기반으로 여러 디렉터리 내의 파일 이름 바꾸기

부분 디렉터리 이름을 기반으로 여러 디렉터리 내의 파일 이름 바꾸기

다양한 확장자의 파일이 있는 위치에 많은 디렉토리가 있습니다. 디렉토리는 표준 규칙을 따르지만 그 안에 있는 파일은 그렇지 않습니다. 내가 시도하고 있는 해결책은 내가 거쳐야 하는 폴더 목록에 대해 해당 파일이 위치한 디렉터리의 일부를 기반으로 각 폴더 내의 파일 이름을 바꾸는 것입니다.

예를 들어:

디렉토리: 001234@Redsox#17

file1.pdf
file7A.doc
spreadsheet.xls

산출:

[email protected]
[email protected]
[email protected]

각 디렉터리를 따라가면서 디렉터리 이름에 추가된 코드만 이름을 바꿉니다. 프로세스를 운영하기 위한 기본 프레임워크가 이미 있지만 필요한 디렉토리 부분을 가져오는 최선의 방법을 잘 모르겠습니다.

for directory in *; do 
    pushd "$directory"
    index=1
    for filename in *; do
        target_filename="${directory}$????${filename}"
        mv "$filename" "${target_filename}"
        ((index++))
   done
  popd
done

답변1

나는 다음과 같이 할 것입니다 :

# nullglob
#    If set, Bash allows filename patterns which match no files to
# expand to a null string, rather than themselves.
shopt -s nullglob

# instead of looping through the dirs, loop through the files
# add al the possible extensions in the list
$ for f in */*.{doc,pdf,xls,txt}; do 
  # get the file dirname
  d=$(dirname "$f")
                  # using parameter expansion get the part
                  # of the dirname you need
  echo mv -- "$f" "$d/${d%%@*}@$(basename "$f")"

  # when you are satisfied with the result, remove the `echo`
done
$ ls -1 001234@Redsox#17/
[email protected]
[email protected]
[email protected]

관련 정보