О доступе к файлу (именам) в указанном каталоге c и изменении его - PullRequest
0 голосов
/ 29 марта 2020

Я пишу код для обмена верхнего и нижнего алфавита имени файла в определенной директории. Если каталог не может получить доступ, он показывает сообщение об ошибке.


#!/bin/bash

if [ $# -eq 0 ];then

    path=$(pwd)
    for a in "$path"/*
    do
         mv "$i" "`echo $i | tr '[:upper:][:lower:]' '[:lower:][:upper:]'`"
    done

else

    if [ ! -d "$1" ];then
        echo "Unable to access directory!"
    else
        for i in "$1"/*
        do
            mv "$i" "`echo $i | tr '[:upper:][:lower:]' '[:lower:][:upper:]'`"
        done
        fi
 fi

Проблема заключается в том, что, когда я повторяю $i, это не express ТОЛЬКО имя файла, но имя файла с каталогом! Таким образом, когда я пытаюсь скопировать файл, меняется не только имя файла, но и имя каталога ТАКЖЕ, поэтому я не могу скопировать файл. Например:

mv: cannot move 'test3/Ipad.txt' to 'TEST3/iPAD.TXT': No such file or directory
mv: cannot move 'test3/iPhone' to 'TEST3/IpHONE': No such file or directory
mv: cannot move 'test3/macOS' to 'TEST3/MACos': No such file or directory

как мне изменить имена файлов в определенном каталоге?

Любая помощь будет полезна, и спасибо заранее.

Ответы [ 2 ]

1 голос
/ 29 марта 2020

Я бы использовал один l oop для обработки обоих случаев.

#! /bin/sh -
case $# in
( 0 ) path=. ;;
( * ) path=$1
esac

for fpath in "$path"/*; do
  echo mv -- "$fpath" "${fpath%/*}/$(
    printf '%s\n' "${fpath##*/}" |
      tr '[a-zA-Z]' '[A-Za-z]')"
done

Если указанный пользователем путь отсутствует или недоступен, произойдет ошибка, не причинившая вреда. Но если вы настаиваете на том, чтобы справиться с этим самостоятельно, добавьте проверку перед l oop или используйте nullglob с bash, и в этом случае скрипт завершит работу молча.

Также обратите внимание, что вероятность того, что файлы здесь не должно быть ни прописных, ни строчных букв в их именах. С ними ничего не случится, но М.В. пожалуется, что источник и цель одинаковы.

0 голосов
/ 29 марта 2020

Вы можете сначала перейти в каталог, а затем работать с именами файлов в каталоге:

#!/bin/bash

if [ $# -eq 0 ]; then

    path=$(pwd)
    cd "$path"
    for a in *
    do
        mv "$i" "`echo $i | tr '[:upper:][:lower:]' '[:lower:][:upper:]'`"
    done
    cd -
else

    if [ ! -d "$1" ]; then
        echo "Unable to access directory!"
    else
        cd "$1"
        for i in *
        do
            mv "$i" "`echo $i | tr '[:upper:][:lower:]' '[:lower:][:upper:]'`"
        done
        cd -
    fi
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...