스크립트는 경로 디렉토리에 지정된 모든 파일의 이름을 바꿉니다.

스크립트는 경로 디렉토리에 지정된 모든 파일의 이름을 바꿉니다.

경로 디렉토리에 지정된 모든 파일의 이름을 대문자로 바꾸는 스크립트를 Ubuntu에서 작성해야 합니다. 파일 이름을 바꾸는 루프를 찾았지만 루프에 경로를 전달하는 방법을 잘 모르겠습니다. 도와주세요?

이것은 루프입니다:

for f in *; do 
    mv "$f" "$f.tmp"; 
    mv "$f.tmp" "`echo $f | tr "[:lower:]" "[:upper:]"`"; 
done

나는 이런 길을 통과하려고 노력했다.

for f in path_to_dir* ...

하지만 그것이 하는 일은 어떻게든 .tmp 디렉토리를 만드는 것뿐입니다.

답변1

나는 다음과 같은 일을 할 것입니다 :

#! /bin/zsh -
ret=0
autoload zmv
for dir do
  (cd -P -- "$dir" && zmv '*(#qN)' '$f:u') || ret=$?
done
exit "$ret"

스크립트 이름은 다음과 같습니다.

that-script /path/to/dir /path/to/other/dir...

답변2

for f in /path/to/dir*나는 당신이 비슷한 일을 대신 했다고 생각합니다 /path/to/dir/*. 전자는 /path/to이름이 로 시작하는 파일과 디렉터리를 찾는 dir반면, 후자는 디렉터리의 내용을 반복합니다.

tr어쨌든, 사용하는 명령이 변경되므로 이는 도움이 되지 않습니다.모든 것, 대문자를 포함하여 존재하지 않는 상태로 /path/to/dir남습니다 . /PATH/TO/DIR좋은 소식은 더 쉬운 방법으로 이 작업을 수행할 수 있다는 것입니다.

Bash를 사용하는 경우 ${var^^}. 그래서 당신은 이것을 할 수 있습니다 :

for f in /path/to/dir/*; do
    ## get the file's name
    name=$(basename -- "$f")
    ## make the new name
    mv -- "$f" /path/to/dir/"${name^^}"
done

또는 디렉터리 이름을 두 번 입력하지 않으려면 변수에 저장할 수 있습니다.

targetPath="/path/to/dir"
for f in "$targetPath"/*; do
    ## get the file's name
    name=$(basename -- "$f")
    ## make the new name
    mv -- "$f" "$targetPath"/"${name^^}"
done    

cd그러나 이 경우 대상 디렉터리로 직접 이동하여 작업하는 것이 더 간단하고 명확합니다.

targetPath="/path/to/dir"
cd -- "$targetPath" && 
for f in *; do
    mv -- "$f" "${f^^}"
done

또는 새 디렉터리로 끝나는 것을 방지하려면 하위 셸에서 루프를 실행하세요.

targetPath="/path/to/dir"
( cd -- "$targetPath" && 
for f in *; do
    mv -- "$f" "${f^^}"
done
)

마지막으로 다음 명령을 사용하여 이 모든 작업을 수행할 수도 있습니다 ( perl-renameUbuntu에서 호출 rename및 설치됨 sudo apt install rename).

rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*

제조업체는 -n수행 rename하지 않고 수행할 작업만 인쇄합니다. 작동하는 것에 만족한다면 -n실제로 파일 이름을 바꾸지 않고 다시 실행하십시오.

관련 정보