Eu sei que você pode fazer mkdir
para criar um diretório e touch
criar um arquivo, mas não há como fazer as duas operações de uma só vez?
ou seja, se eu quiser fazer o abaixo quando a pasta other
não existir:
cp /my/long/path/here/thing.txt /my/other/path/here/cpedthing.txt
Erro:
cp: cannot create regular file `/my/other/path/here/cpedthing.txt': No such file or directory
Alguém veio com uma função como solução alternativa para isso?
Respostas:
Use
&&
para combinar dois comandos em uma linha de shell:Nota: Anteriormente, eu recomendei o uso de
;
para separar os dois comandos, mas, como apontado pelo @trysis, provavelmente é melhor usar&&
na maioria das situações, pois, caso asCOMMAND1
falhasCOMMAND2
também não sejam executadas. Caso contrário, isso pode levar a problemas que você não esperava.fonte
&&
, assim como;
se o primeiro comando falhar, o segundo comando ainda será executado (e falhará também, pois esse diretório ainda não existe). Com&&
se o primeiro comando falhar, o segundo comando não será executado.mkdir -p /my/other/path/here && touch $_/cpredthing.txt
. O$_
expande para essencialmente o "último argumento no último comando executado".touch
ter um-p
parâmetro comomkdir
faz.Você precisa criar todos os diretórios principais primeiro.
Se você deseja ser criativo, pode fazer uma função :
E então use-o como qualquer outro comando:
fonte
&&
- Como é isso?supertouch "/tmp/abc/def ghi/jkl mno.txt"
e falhou. Todos os comandosdirname
,mkdir
etouch
deu Erros.mktouch
isto é.Faça isso com / usr / bin / install:
quando você não possui um arquivo de origem:
fonte
-D /dev/null
, o que é mais fácil para mim lembrar.Isto é o que eu faria:
mkdir -p /my/other/path/here && touch $_/cpredthing.txt
Aqui,
$_
é uma variável que representa o último argumento para o comando anterior que executamos em linha.Como sempre, se você quiser ver qual será a saída, pode testá-la usando o
echo
comando, da seguinte maneira:echo mkdir -p /code/temp/other/path/here && echo touch $_/cpredthing.txt
Que gera como:
Como bônus, você pode gravar vários arquivos ao mesmo tempo usando a expansão entre chaves, por exemplo:
Novamente, totalmente testável com
echo
:fonte
fonte
dirname -z "$@" | xargs -0 mkdir -p
, pelo bem do desempenho. (Stop à espreita, e juntar-se, pelo amor de Pete ;-)!você pode fazer isso em duas etapas:
fonte
fonte
como eu vi e testei em um fórum unix, isso resolve o problema
fonte
não há necessidade de
if then
declarações ... você pode fazê-lo em uma única linha;
- ou em duas linhas -
- o
-p
erro impede que retorne se o diretório já existir (que é o que eu vim aqui procurando :))fonte
No caso especial (mas não incomum) em que você está tentando recriar a mesma hierarquia de diretórios,
cp --parents
pode ser útil.Por exemplo, se
/my/long
contém os arquivos de origem emy/other
já existe, você pode fazer isso:fonte
se você quiser simples com apenas 1 snippet de parâmetro:
fonte
rm -rf
comandos. - † Ou seja, horas , desde que você adote uma política de controle / backup de versão sensata ... caso contrário, pode levar meses.rm -rf
nunca deve ser sugerido sem explicações e avisos adequados.