Как удалить расширение имени файла из списка имена файлов в Bash

ifconfig eth0 down

Если только вы не делаете что-то необычное (например, применяете IP-псевдонимы), вы не должны использовать ifconfig (или его преемника, ip(8)) напрямую. Вы должны сказать ifdown eth0 здесь. Это поможет решить многие проблемы, которые не решает ifconfig.

traceroute -i eth0 stackoverflow.com

В вашей таблице маршрутов указано, что маршрут по умолчанию проходит через wlan0, а не через eth0, поэтому вы тестируете не то, что думаете.

192.168.1.4 все еще может использоваться в моей локальной сети

Конечно. Если вы посмотрите назад на вывод ifconfig, вы увидите UP в разделе eth0.

192.168.1.4 mywp.com

Вы не должны использовать .com или другие официальные ДВУ для частных сетей. Для чисто локальных хостов, определенных в /etc/hosts, вам вообще не нужно их полностью квалифицировать. Это совершенно законно:

192.168.1.4 mywp

Имея эту запись /etc/hosts, вы можете посетить http://mywp в браузере. Будьте осторожны: стремление современных браузеров унифицировать поля поиска и местоположения означает, что один только ввод mywp в поле, скорее всего, будет рассматриваться как поисковый запрос, а не как имя хоста. Большинство браузеров пропустят это, если вы включите какой-нибудь знак препинания, так что mywp/ скажет браузеру, что вы хотите, чтобы он рассматривал mywp как имя хоста, а не как поисковый запрос.

Если вы чувствуете необходимость в полностью выверенных доменных именах, настройте конфигурацию сети так, чтобы назначить локальное доменное имя для локальной сети, например literature.private. ДВУ .private - это традиционный вариант для доменов только для локальных сетей. (Другая распространенная альтернатива - .local.) Часть literature я просто взял из вашего имени пользователя.

Сделав это, та же самая запись /etc/hosts все равно будет искаться правильно, если вы перейдете на http://mywp.literature.private в своем веб-браузере.

0
14.08.2018, 17:04
3 ответа

Думаю, вы захотите создать массив вместо строки:

IFS=$'\n' # split on newline only
set -o noglob # disable the glob part
file_list=($(find. -name '*.*' -type f))

Или с bash 4.4+, без разрыва пути к файлу с символами новой строки:

readarray -td '' file_list < <(find. -name '*.*' -type f -print0)

Тогда раскрытие вашего параметра должно работать, хотя здесь имеет смысл снова использовать переменную массива:

trimmed_file_list=("${file_list[@]%.*}")

В примере кода вы создаете строку, а затем запрашиваете расширение параметра, чтобы удалить все после последнего символа точки в полной строке.

3
28.01.2020, 02:16

Вы можете сделать все одной командой.

find /path/to -type f -execdir bash -c 'printf "%s\n" "${@%.*}"' bash {} +
5
28.01.2020, 02:16

В вашем коде нет массивов. Кроме того, он помещает список имен файлов в строку $file_list. Содержимое строки будет заканчиваться на file3.png, а ваша замена параметра удаляет .pngиз строки, оставляя вас с одной строкой имен файлов, где последнее имя файла не имеет суффикса имени файла.

Помещение нескольких отдельных объектов (путей )в одну строку автоматически лишает скрипт возможности работать должным образом с файлами, имена которых содержат пробелы (или любой другой разделитель, используемый в строке ). Использование массива не поможет, так как вы все равно разделите вывод findна пробелы.


Чтобы обрезать расширение всех имен обычных файлов в текущем каталоге или ниже:

find. -type f -name "*.*" -exec sh -c '
    for pathname do
        printf "Would move %s to %s...\n" "$pathname" "${pathname%.*}"
        # mv -i "$pathname" "${pathname%.*}"
    done' sh {} +

Ищет обычные файлы, имена которых содержат хотя бы одну точку. Пути к этим файлам передаются пакетами в небольшой сценарий оболочки, который зацикливается на них. Сценарий оболочки переименовывает файлы, удаляя последнюю точку в имени файла и все, что следует за ним. Фактическая команда mvзакомментирована для безопасности.

Команда findдействует как генератор путей для внутреннего сценария оболочки, и мы гарантируем правильную обработку путей, содержащих пробелы, новые строки и табуляции. Нет необходимости хранить вывод команд в переменных.

Если у вас есть массив путей, возможно, созданный с помощью

shopt -s globstar nullglob
file_list=( **/*.* )  # get pathnames of files with dots in their names

Тогда вы сможете выводить пути без суффиксов с помощью

printf '%s\n' "${file_list[@]%.*}"

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

Связанные:

1
28.01.2020, 02:16

Теги

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