경로 디렉토리에 지정된 모든 파일의 이름을 대문자로 바꾸는 스크립트를 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-rename
Ubuntu에서 호출 rename
및 설치됨 sudo apt install rename
).
rename -n 's|([^/]+)$|uc($1)|e' /path/to/dir/*
제조업체는 -n
수행 rename
하지 않고 수행할 작업만 인쇄합니다. 작동하는 것에 만족한다면 -n
실제로 파일 이름을 바꾸지 않고 다시 실행하십시오.