Ответ 1
В perl, используя один из моих любимых модулей: Path::Tiny.
path("/opt/test/test.txt")->touchpath;
Из документа:
Объединяет mkpath и touch. Создает родительский каталог, если он не существуют, прежде чем прикасаться к файлу.
Мне нужно прикоснуться к файлу с абсолютным именем файла, например:/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'
}
Есть ли лучший способ упростить код? Я надеюсь, что есть некоторые системные команды, которые могут выполнять одну и ту же работу только с одной строкой.
В perl, используя один из моих любимых модулей: Path::Tiny.
path("/opt/test/test.txt")->touchpath;
Из документа:
Объединяет mkpath и touch. Создает родительский каталог, если он не существуют, прежде чем прикасаться к файлу.
В оболочке script вы можете просто:
mkdir -p /opt/test && touch /opt/test/test.txt
mkdir -p
не сработает (и ничего не сделает), если каталог уже существует.
В perl используйте make_path
из модуля File::Path
, затем создайте файл, как хотите. make_path
также не делает ничего, если каталог уже существует, поэтому вам не нужно проверять себя.
Perl из командной строки,
perl -MFile::Basename -MFile::Path=make_path -e'
make_path(dirname($_)), open(F, ">>", $_) for pop;
' /opt/test/test.txt
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.
Я определил a touchp
в моем ~/.bash_aliases
:
function touchp() {
/bin/mkdir -p "$(dirname "$1")/" && /usr/bin/touch "$1"
}
Он молча создает структуру над файлом, если она отсутствует, и совершенно безопасна для использования при передаче одного имени файла без какой-либо директории перед ним.
Мне нравится печатать очень мало, поэтому я помещал эту команду в имя fn в моем .profile, но я использовал эту формулировку в течение многих лет, прежде чем я это сделал:
mkdir -p dirname/sub/dir && touch $_/filename.ext
Переменная $_
хранит последний аргумент предыдущей команды. Довольно удобно знать об общем.
Подключите Python к командной строке.
то есть. Используйте pyp
cat filepaths.txt | pyp "'mkdir -p '+s[0:-1]|s+'; touch '+o" | sh
The Pyed Piper ", или pyp, представляет собой инструмент командной строки для командной строки linux, подобный awk или sed, но который использует стандартные методы строки и списка python, а также настраиваемые функции, разработанные для быстрого получения результатов в интенсивной производственной среде.
У меня есть эта функция оболочки в моем файле .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
команда не вызывается.