オンライン評価を受けていますが、次の質問を受けました。
/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()