ユーザー入力に応じて、すべてのファイルの拡張子を変更します。

ユーザー入力に応じて、すべてのファイルの拡張子を変更します。

オンライン評価を受けていますが、次の質問を受けました。

  • /usr/local/bin/set-file-extensionsユーザー入力に応じて、ディレクトリ内のすべてのファイルの拡張子を変更するスクリプトをここに作成します。/var/dump/files
  • スクリプトは、-Eユーザーが3文字の拡張子(.ie log)を渡すことを可能にするオプションフラグをサポートする必要があります。
  • ユーザーが 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

引用する

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

関連情報