파일 끝에 영숫자 확장자를 추가하는 OSX용 bash 스크립트를 만들려고 합니다.
임의의 6자를 생성하는 방법을 찾을 수 없습니다. 이전 파일명_cod_45fg43.zip
스크립트는 다음과 같습니다.
for fname in *.zip
do
CODE= ???
CODESTRING="_cod_$CODE"
mv "$fname" "${fname%.zip}$CODESTRING.zip"
done
답변1
당신이 사용할 수있는 mktemp
:
$ mktemp foobarXXXXXX
foobarAU7TyS
$ mktemp foobarXXXXXX
foobardDqS61
$ mktemp foobarXXXXXX
foobarioCZw2
귀하의 예에서는 다음과 같을 수 있습니다.
mv "$fname" "$(mktemp "${fname%.zip}"XXXXXX.zip)"
하지만 몇 가지 테스트를 해봐야 합니다. "X"로 끝나는 zip 파일에서는 이상한 일이 발생합니다... ;) (X가 아닌 접미사/구분 기호가 필요하며 이 예에서는 편리하게 생략했습니다).
장점은 mktemp
가능성에 관계없이 파일 이름이 이미 존재하지 않는다는 것을 보장한다는 것입니다. 물론, 위의 예에서는 애초에 오류를 확인하지 않으면 소용이 없습니다...
또는 mv
.--backup
(처음에 이 작업을 수행하려는 이유에 따라 다릅니다.)
답변2
이것은 작동합니다:
for fname in *.zip
do
CODE="$(tr -dc '[:alnum:]' </dev/urandom | head -c 6)"
CODESTRING="_cod_${CODE}"
YOUR mv CODE
done
답변3
우리는 기존 파일에 들어가는 것을 피하기 위해 많은 노력을 기울였으며 mv-ing
이전에 존재하지 않았던 새로운 파일 이름을 자동으로 생성하고 스스로 소유할 수 있었습니다.
orig_umask=`umask`
umask 077; # take away perms from others + group
orig_state=$(set +o | awk '$3 == "noclobber"')
set -C; # cannot overwrite now
for fname in ./*.zip
do
while :
do
CODE=$(head /dev/urandom | tr -cd 'a-zA-Z0-9_' | dd bs=1 count=6 2>/dev/null)
CODESTRING="code_${CODE}"
new_name=${fname%".zip"}_${CODESTRING}.zip
{ > $new_name; } &>/dev/null && break
done
mv -f "$fname" "$new_name"
done
# recover state
eval "$orig_state"
umask "$orig_umask"