我正在参加在线评估,并收到以下问题。
- 创建位于此处的脚本,该脚本将根据用户输入
/usr/local/bin/set-file-extensions
更改目录中所有文件的扩展名。/var/dump/files
- 该脚本应该支持选项标志
-E
,允许用户传递三个字符的扩展名(.ielog
)。 - 如果用户传递了非三个字符的扩展名,则显示错误“输入无效。需要三个字符的扩展名。" 并以状态代码 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() 中指定Required=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
参考