Как прикоснуться к файлу и mkdir, если необходимо, в одной строке

Мне нужно прикоснуться к файлу с абсолютным именем файла, например:/opt/test/test.txt, но я не уверен, существует ли /opt/test в системе. Таким образом, код должен схоже с этим:

if (-d '/opt/test') {
    touch '/opt/test/test.txt';
} else {
    mkdir -p '/opt/test';
    touch '/opt/test/test.txt'
}

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

Ответ 1

В perl, используя один из моих любимых модулей: Path::Tiny.

path("/opt/test/test.txt")->touchpath;

Из документа:

Объединяет mkpath и touch. Создает родительский каталог, если он не существуют, прежде чем прикасаться к файлу.

Ответ 2

В оболочке script вы можете просто:

mkdir -p /opt/test && touch /opt/test/test.txt

mkdir -p не сработает (и ничего не сделает), если каталог уже существует.

В perl используйте make_path из модуля File::Path, затем создайте файл, как хотите. make_path также не делает ничего, если каталог уже существует, поэтому вам не нужно проверять себя.

Ответ 3

Perl из командной строки,

perl -MFile::Basename -MFile::Path=make_path -e'
  make_path(dirname($_)), open(F, ">>", $_) for pop;
' /opt/test/test.txt

Ответ 4

mkdir B && touch B/myfile.txt

В качестве альтернативы создайте функцию:

   mkfile() { 
    mkdir -p $( dirname "$1") && touch "$1" 
   }

Выполните его с помощью 1 аргумента: путь к файлу. Говоря:

mkfile B/C/D/myfile.txt

создаст файл myfile.txt в каталоге B/C/D.

Ответ 5

Я определил a touchp в моем ~/.bash_aliases:

function touchp() {
  /bin/mkdir -p "$(dirname "$1")/" && /usr/bin/touch "$1"
}

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

Ответ 6

Мне нравится печатать очень мало, поэтому я помещал эту команду в имя fn в моем .profile, но я использовал эту формулировку в течение многих лет, прежде чем я это сделал:

mkdir -p dirname/sub/dir && touch $_/filename.ext

Переменная $_ хранит последний аргумент предыдущей команды. Довольно удобно знать об общем.

Ответ 7

Подключите Python к командной строке.

то есть. Используйте pyp

 cat filepaths.txt | pyp "'mkdir -p '+s[0:-1]|s+'; touch '+o" | sh

The Pyed Piper ", или pyp, представляет собой инструмент командной строки для командной строки linux, подобный awk или sed, но который использует стандартные методы строки и списка python, а также настраиваемые функции, разработанные для быстрого получения результатов в интенсивной производственной среде.

Ответ 8

У меня есть эта функция оболочки в моем файле .zshalias:

function touch-safe {
    for f in "[email protected]"; do
      [ -d $f:h ] || mkdir -p $f:h && command touch $f
    done
}
alias touch=touch-safe

Если test или команда mkdir не mkdir, никакая touch команда не вызывается.