Как сделать второй аргумент относительным к первому в команде?

Вопрос или проблема

в примере предположим, что вы хотите скопировать файл таким образом

cp путь/к/файлу/file.txt путь/к/файлу/file.copy

очень раздражает писать путь дважды, так что есть ли что-то вроде этого с специальным символом:

cp путь/к/файлу/file.txt :)file.copy

это будет очень полезно, особенно если вы пытаетесь diff два файла в одной директории

Ответ или решение

Для того чтобы сделать второй аргумент относительным к первому в команде Unix, можно использовать несколько подходов, но стоит отметить, что в стандартных командах, таких как cp, нет специального синтаксиса, подобного :). Однако, есть несколько способов упростить запись команды и избежать повторения пути:

  1. Использование оболочечного скрипта или командной подмены: Вы можете использовать комбинацию команд оболочки для извлечения директории из первого аргумента и его последующего использования. Например:

    cp path/to/the/file.txt $(dirname path/to/the/file.txt)/file.copy

    В данном случае $(dirname path/to/the/file.txt) возвращает путь к директории, что позволяет вам создать полный путь к новому файлу.

  2. Использование переменных: Вы можете сохранить путь в переменной, чтобы избежать его повторного написания. Это будет особенно полезно в более длинных командах.

    src="path/to/the/file.txt"
    cp "$src" "${src%.txt}.copy"

    Здесь ${src%.txt} удаляет расширение .txt из переменной, позволяя вам создать новый файл с расширением .copy.

  3. Создание функции в .bashrc или .zshrc: Если вы часто выполняете подобные операции, вы можете создать функцию. Например:

    function cpc() {
       cp "$1" "${1%.*}.copy"
    }

    После добавления этой функции вы сможете просто вызывать cpc path/to/the/file.txt, и она автоматически создаст копию файла с нужным именем.

  4. Применение команд dirname и basename: Если вы хотите получить только имя файла и заменить его, можно использовать basename в сочетании с dirname:

    cp path/to/the/file.txt "$(dirname path/to/the/file.txt)/$(basename path/to/the/file.txt .txt).copy"

Эти методы позволяют вам сократить вводимый текст и избежать дублирования путей. Надеюсь, это поможет вам эффективно использовать командную строку для копирования и сравнения файлов!

Оцените материал
Добавить комментарий

Капча загружается...