измените расширение всех файлов на основе ввода данных пользователем

Здесь простой пример:

#!/bin/bash

files_to_copy=''
destination_directory=''

while (("$#")) ; do
  if [[ "$@" = "$1" ]] ; then
    # last argument
    destination_directory="$1"
  else
    # argument
    files_to_copy="$files_to_copy $1"
  fi
  shift
done

scp user@remote.server:"$files_to_copy" $destination_directory;

Если вы запустите ./ Пример .sh foo.pdf foo.txt foo.jpg Резервное копирование / Вы должны получить:

# this will be executed
scp user@remote.server:" foo.pdf foo.txt foo.jpg" backup/
0
20.08.2014, 22:01
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

0
28.01.2020, 02:52

Вы не Не уточняю, что это должно быть решение на bash, так что вот решение на Python. При этом учитывается, что вам требуется 3-символьное расширение. Однако это не так уж важно для проверки, что вы ничего не сломаете. Он проверяет каталоги и то, что вы собираетесь переименовывать только реальные файлы. Это решение потребует передачи опции -E.

edit:

Если имя файла начинается с a. (скрытый файл) игнорировать. Что касается символических ссылок, об этом, возможно, придется подумать.

#!/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'. Вы можете указать Required = True в add_argument (), чтобы сделать его обязательным параметром.

#!/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()
1
28.01.2020, 02:52

Теги

Похожие вопросы