LINUX.ORG.RU

История изменений

Исправление grem, (текущая версия) :

Если бы мне представили жесткий выбор из этих двух сортов, то я бы выбрал наверно powershell

В некоторых случаях PS, наверняка, даже удобнее. Пример для cmd (да, даже в .bat-файлах для cmd в данном примере удобнее) и bash - вывод коротких имён файлов (file 1.txt, file 2.txt) в подкаталоге в «mydir» (пусть он даже в виде переменной из внешнего цикла) текущей директории в .bat-файле для cmd:

@echo off
for %%F in ("mydir/*.txt") do echo %%~nF
вывод:
file 1
file 2
То есть у цикла for для cmd есть встроенные операции подстановки ссылок. В данном случае для получения короткого имени файла (без пути и расширения) используется ключ ~n для переменной F. Имя итератор, жаль, при этом может состоять только из одного символа.

для bash:

#~/bin/bash
IFS_init=$IFS
IFS=$'\n'
for FILE in mydir/*txt; do echo $(basename "$FILE" .txt); done
IFS=$IFS_init
вывод:
file 1
file 2
Если не использовать подстановку с вызовом внешней команды basename, то вывод будет таким:
mydir/file 1.txt
mydir/file 2.txt
Чтобы отрезать расширения и имя базовой директории можно было б использовать подстановку ${${FILE%.*}##*/}, но в bash она не работает (работает в zhs). Как вариант, вместо echo $(basename "$FILE" .txt) можно использовать такого монстра:
echo $(TMP=${FILE##*/};echo ${TMP%.*})
, но это опять же не встроенное средство цикла for, да и для обработки пробелов в именах приходиться переопределять разделитель в переменной IFS.

Исправление grem, :

Если бы мне представили жесткий выбор из этих двух сортов, то я бы выбрал наверно powershell

В некоторых случаях PS, наверняка, даже удобнее. Пример для cmd (да, даже в .bat-файлах для cmd в данном примере удобнее) и bash - вывод коротких имён файлов (file 1.txt, file 2.txt) в подкаталоге в «mydir» (пусть он даже в виде переменной из внешнего цикла) текущей директории в cmd:

@echo off
for %%F in ("mydir/*.txt") do echo %%~nF
вывод:
file 1
file 2
То есть у цикла for для cmd есть встроенные операции подстановки ссылок. В данном случае для получения короткого имени файла (без пути и расширения) используется ключ ~n для переменной F. Имя итератор, жаль, при этом может состоять только из одного символа.

для bash:

#~/bin/bash
IFS_init=$IFS
IFS=$'\n'
for FILE in mydir/*txt; do echo $(basename "$FILE" .txt); done
IFS=$IFS_init
вывод:
file 1
file 2
Если не использовать подстановку с вызовом внешней команды basename, то вывод будет таким:
mydir/file 1.txt
mydir/file 2.txt
Чтобы отрезать расширения и имя базовой директории можно было б использовать подстановку ${${FILE%.*}##*/}, но в bash она не работает (работает в zhs). Как вариант, вместо echo $(basename "$FILE" .txt) можно использовать такого монстра:
echo $(TMP=${FILE##*/};echo ${TMP%.*})
, но это опять же не встроенное средство цикла for, да и для обработки пробелов в именах приходиться переопределять разделитель в переменной IFS.

Исходная версия grem, :

Если бы мне представили жесткий выбор из этих двух сортов, то я бы выбрал наверно powershell

В некоторых случаях PS, наверняка, даже удобнее. Пример для cmd (да, даже в .bat-файлах для cmd в данном примере удобнее) и bash - вывод коротких имён файлов (file 1.txt, file 2.txt) в подкаталоге в «mydir» (пусть он даже в виде переменной из внешнего цикла) текущей директории в cmd:

@echo off
for %%F in ("mydir/*.txt") do echo %%~nF
вывод:
file 1
file 2
То есть у цикла for для cmd есть встроенные операции подстановки ссылок. В данном случае для получения короткого имени файла (без пути и расширения) используется ключ ~n для переменной F. Имя итератор, жаль, при этом может состоять только из одного символа.

для bash:

IFS_init=$IFS
IFS=$'\n'
for FILE in mydir/*txt; do echo $(basename "$FILE" .txt); done
IFS=$IFS_init
вывод:
file 1
file 2
Если не использовать подстановку с вызовом внешней команды basename, то вывод будет таким:
mydir/file 1.txt
mydir/file 2.txt
Чтобы отрезать расширения и имя базовой директории можно было б использовать подстановку ${${FILE%.*}##*/}, но в bash она не работает (работает в zhs). Как вариант, вместо echo $(basename "$FILE" .txt) можно использовать такого монстра:
echo $(TMP=${FILE##*/};echo ${TMP%.*})
, но это опять же не встроенное средство цикла for, да и для обработки пробелов в именах приходиться переопределять разделитель в переменной IFS.