7

Я пытаюсь научиться переименовывать файлы с помощью командной строки, и после просмотра большого количества страниц я наконец-то нашел команду, в которой прописные буквы начинаются с первой буквы файла, но проблема в том, что я хочу понять смысл каждой команды , Команда:

for i in *; do new=`echo "$i" | sed -e 's/^./\U&/'`; mv "$i" "$new";done

Я понимаю «for», но не «echo» или «` », а особенно команду sed. если у кого-то есть немного терпения, чтобы объяснить смысл каждой вещи, это было бы здорово! Спасибо!

5 ответов5

16
for i in *; 
    do new=`echo "$i" | sed -e 's/^./\U&/'`;
    mv "$i" "$new";
done;

Будет ли весь код разбит, чтобы его было легко просматривать, я объясню ниже.


Сначала мы должны убедиться, что мы обрабатываем каждый файл, следующая строка означает: «Делайте следующее, пока вы можете найти файлы»

for i in *;

Затем мы должны загрузить текущее имя файла (которое хранится в переменной $ i), заменить первую букву заглавной версией и сохранить новое имя (в переменной $ new).

Следующая команда в основном означает: Создать переменную $ new (do new=) Загрузить $ i и переслать ее ("$i" |) в функцию, которая заменяет первую букву заглавной. (sed -e 's/^./\U&/' ; `)

Страницу руководства sed можно найти здесь. Он используется для выполнения базовых преобразований текста. Что в основном делает, это использует регулярное выражение ('s/^./\U&/' part) (способ обнаружения определенного шаблона в тексте) для обнаружения некапитализированных первых символов и замены его заглавными буквами.

do new=echo "$i" | sed -e 's/^./\U&/';

После того, как мы получили новое имя, пришло время переименовать файл с новым заглавным именем, следующая команда сделает это.

Он говорит: переместить (так же, как переименовать) старый файл foo.bar на новый Foo.bar.

mv "$i" "$new";

Итак, теперь у нас один файл переименован, и пришло время перейти к следующему. Следующее завершает функцию for, сообщая, что настало время перейти к следующему файлу и обработать его.

done;
5

Вот несколько других техник, если ваш sed не поддерживает \U:

for i in *; do first=$(echo "${i:0:1}" | tr '[:lower:]' '[:upper:]'); new=$first${i:1}; mv "$i" "$new"; done

Если у вас есть Bash 4:

for i in *; do mv "$i" "${i^}"; done
4

Добро пожаловать в Bash, где все возможно, если не сразу.

Объяснение BloodPhilia очень хорошо для вашего конкретного запроса. Если вам интересно, вот несколько дополнительных веб-ресурсов, чтобы узнать больше:

Bash:

Сед (который является 'S'tream' ED'itor):

1

Чтобы использовать каждый первый символ в имени файла с помощью BASH, вы можете использовать следующую конструкцию: file_words=( $file ) echo "${file_words[@]^}"

Это намного понятнее, чем использование sed, и вы используете только BASH, так что это быстрее.

-1

А если у тебя есть зш:

for i in *; do mv $i ${(C)i}; done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .