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