根据用户输入更改所有文件的扩展名

根据用户输入更改所有文件的扩展名

我正在参加在线评估,并收到以下问题。

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

参考

https://stackoverflow.com/a/14203146/1742825

相关内容