온라인 평가를 받고 있는데 다음과 같은 질문을 받았습니다.
/usr/local/bin/set-file-extensions
사용자 입력에 따라 디렉터리에 있는 모든 파일의 확장자를 변경하는 스크립트를 여기에 만듭니다 ./var/dump/files
- 스크립트는
-E
사용자가 3자 확장자(.ielog
)를 전달할 수 있도록 하는 옵션 플래그를 지원해야 합니다. - 사용자가 3자가 아닌 확장명을 전달하면 오류 "잘못된 입력. 3자리 확장자가 필요합니다."하고 상태 코드 19로 종료되었습니다.
- 파일 확장자를 받은 후 스크립트는
/var/dump/files
해당 확장자를 가진 디렉터리 아래의 모든 파일 이름을 바꿔야 합니다. 즉, 이름myfile
이 지정된 파일 의 이름을myfile.log
.
답변1
bash 솔루션이어야 한다고 지정하지 않았으므로 여기에 Python 솔루션이 있습니다. 3자 확장자가 필요하다는 점을 고려합니다. 그러나 아무 것도 깨지지 않았는지 확인하는 것은 별로 도움이 되지 않습니다. 디렉토리를 확인하고 실제 파일의 이름만 바꾸게 됩니다. 이 솔루션을 사용하려면 -E 옵션을 전달해야 합니다.
편집하다:
파일 이름이 .(숨겨진 파일)로 끝나는 경우 무시합니다. 심볼릭 링크와 관련하여 좀 더 생각해 볼 필요가 있습니다.
#!/usr/bin/env python
import sys
import argparse
import re
import os
def main():
path = '/var/dump/files'
parser = argparse.ArgumentParser()
parser.add_argument('-E', help='three character extension(.i.e log)',\
type=str)
args = parser.parse_args()
if args.E:
if not re.search(r'^[a-zA-Z]{3}$', args.E):
print 'Invalid Input. A three character extenstion required: %s' % str(args.E)
sys.exit(19)
ext = '.'+str(args.E)
else:
print 'Invalid Input. A three character extenstion required'
sys.exit(19)
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]
for f in files:
# ignore hidden files
if f[0] == '.': continue
name = f.split('.')[0]
os.rename(os.path.join(path,f),os.path.join(path,name+ext))
if __name__ == "__main__":
main()
이 솔루션은 -E 옵션이며 ".log"를 기본값으로 사용합니다. add_argument()에서 필수=True를 지정하여 필수 옵션으로 만들 수 있습니다.
#!/usr/bin/env python
import sys
import argparse
import re
import os
def main():
path = '/var/dump/files'
parser = argparse.ArgumentParser()
parser.add_argument('-E', help='three character extension(.i.e log)',\
type=str)
args = parser.parse_args()
if args.E:
if not re.search(r'^[a-zA-Z]{3}$', args.E):
print 'Invalid Input. A three character extenstion required: %s' % str(args.E)
sys.exit(19)
ext = '.'+str(args.E)
else:
ext = '.log'
files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path,f))]
for f in files:
# ignore hidden files
if f[0] == '.': continue
name = f.split('.')[0]
os.rename(os.path.join(path,f),os.path.join(path,name+ext))
if __name__ == "__main__":
main()
답변2
결국 아래와 같은 스크립트를 작성하게 되었습니다.
#!/bin/bash
while [[ $# -ge 1 ]]
do
key="$1"
shift
case $key in
-E)
EXTENSION="$1"
length=$(expr length "$EXTENSION")
if [ $length != 3 ]
then
(exit 19); echo "Invalid Input. A three character
extension is required. Exit status:$?"
else
for f in /var/dump/files/*; do
mv -- "$f" "${f}.$EXTENSION"
done
fi
shift
;;
*)
(exit 19); echo "Invalid Option selected. Exit status:$?"
;;
esac
done
인용하다