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

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

한 위치에 다양한 확장자를 가진 파일이 포함된 여러 디렉터리가 있습니다. 이러한 디렉터리는 표준 규칙을 따르지만 그 안에 있는 파일은 그렇지 않습니다. 제가 찾으려고 하는 해결책은 각 폴더에 있는 파일의 이름을 해당 파일이 있는 디렉터리 부분에 따라 바꾸어 검색해야 하는 폴더 목록을 얻는 것입니다.

예를 들어:

디렉토리: 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]

관련 정보