Bash 스크립트는 파일 이름에 임의의 확장자를 제공합니다.

Bash 스크립트는 파일 이름에 임의의 확장자를 제공합니다.

파일 끝에 영숫자 확장자를 추가하는 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"

관련 정보