Portanto, se eu estiver no meu diretório pessoal e desejar mover foo.c para ~ / bar / baz / foo.c, mas esses diretórios não existirem, existe alguma maneira de criar esses diretórios automaticamente, para que você só teria que digitar
mv foo.c ~/bar/baz/
e tudo daria certo? Parece que você poderia alias mv para um script bash simples que verificaria se esses diretórios existiam e, se não, chamaria mkdir e mv, mas pensei em verificar se alguém tinha uma idéia melhor.
Respostas:
Que tal esse one-liner (no bash):
Quebrando isso:
cria o diretório (incluindo todos os diretórios intermediários), após o qual:
move o arquivo para esse diretório ($ _ se expande para o último argumento passado para o comando shell anterior, ou seja: o diretório recém-criado).
Não sei até que ponto isso funcionará em outros reservatórios, mas pode lhe dar algumas idéias sobre o que procurar.
Aqui está um exemplo usando esta técnica:
fonte
./
todos os lugares? Os argumentos não são comandos no caminho sem o.
diretório ...--parents
não está disponível no macOS 10.13.2. Você precisa usar-p
.mkdir -p ./some/path/foo; mv yourfile.txt $_:h
fonte
dirname
não requer que seu argumento exista, é pura manipulação de strings. Não posso falar por outras distribuições. Nada de errado com este código em questão.for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
Salvar como um script chamado mv ou mv.sh
Ou coloque no final do seu arquivo ~ / .bashrc como uma função que substitui o mv padrão em cada novo terminal. O uso de uma função permite que o bash mantenha a memória, em vez de precisar ler um arquivo de script todas as vezes.
Estes foram baseados na submissão de Chris Lutz.
fonte
mv
comando aprimorado . Especialmente útil para scripts, ou seja, você não quer necessariamente executar as verificações e executarmkdir -p
sempre que precisar usarmv
. Mas como eu desejaria o comportamento de erro padrãomv
, mudei o nome da função paramvp
- para que eu saiba quando poderia criar diretórios.[ ! -a "$dir" ]
eu conduzi experimentos com a metade direita sendo verdadeira e falsa, ambas avaliadas como verdadeiras ?? Pelo amor de outro, tmp = "$ {tmp: -1}" aparece para pegar o último caractere do arquivo para se certificar de que não é um caminho (/)Você pode usar
mkdir
:Um script simples para fazê-lo automaticamente (não testado):
fonte
Parece que a resposta é não :). Eu realmente não quero criar um alias ou uma função apenas para fazer isso, geralmente porque é único e eu já estou no meio da digitação do
mv
comando, mas encontrei algo que funciona bem para isso:Se
mv
falhar (dir não existe), ele criará o diretório (que é o último argumento do comando anterior, o mesmo ocorre$_
). Portanto, basta executar este comando, depois upexecutá-lo novamente, e desta vezmv
deve ter sucesso.fonte
O seguinte script shell, talvez?
Essa é a parte básica. Você pode adicionar um pouco para verificar se há argumentos e mudar o comportamento se o destino existir, ou o diretório de origem existir ou não existir (ou seja, não substituir algo que não existe) .
fonte
O comando rsync pode fazer o truque somente se o último diretório no caminho de destino não existir, por exemplo, para o caminho de destino de
~/bar/baz/
ifbar
existir, masbaz
não existir , o seguinte comando poderá ser usado:rsync -av --remove-source-files foo.c ~/bar/baz/
Nesse caso
baz
diretório será criado se não existir. Mas se ambosbar
ebaz
não existirem, o rsync falhará:Então, basicamente, deve ser seguro usar
rsync -av --remove-source-files
como um alias paramv
.fonte
A maneira mais simples de fazer isso é:
Vamos supor que eu baixei arquivos pdf localizados no meu diretório de downloads (
~/download
) e quero movê-los para um diretório que não existe (digamosmy_PDF
).Digite o seguinte comando (certificando-me de que meu diretório de trabalho atual seja
~/download
):Você pode adicionar a
-p
opçãomkdir
se desejar criar subdiretórios assim: (suponha que eu queira criar um subdiretório chamadopython
):fonte
Sillier, mas trabalhando maneira:
Crie o diretório com mkdir -p, incluindo um diretório temporário que compartilhe o nome do arquivo de destino, remova esse diretório com um rmdir simples e mova o arquivo para o novo destino. Eu acho que a resposta usando dirname é provavelmente o melhor.
fonte
fonte
Código:
Exemplo:
argumentos: "d1" "d2 / sub"
fonte
Isso será movido
foo.c
para o novo diretóriobaz
com o diretório paibar
.A
-p
opção paramkdir
criar diretórios intermediários, conforme necessário.Sem
-p
todos os diretórios no prefixo do caminho, já deve existir.Tudo dentro dos backticks
``
é executado e a saída é retornada em linha como parte do seu comando.Como
mkdir
não retorna nada, apenas a saída deecho $_
será adicionada ao comando.$_
referencia o último argumento ao comando executado anteriormente.Nesse caso, ele retornará o caminho para o seu novo diretório (
~/bar/baz/
) passado para omkdir
comando.Descompactei um arquivo compactado sem dar um destino e queria mover todos os arquivos, exceto
demo-app.zip
do meu diretório atual para um novo diretório chamadodemo-app
.A seguinte linha faz o truque:
ls -A
retorna todos os nomes de arquivos, incluindo arquivos ocultos ( exceto os implícitos.
e..
).O símbolo de canal
|
é usado para canalizar a saída dols
comandogrep
( um utilitário de pesquisa em linha de comando e texto sem formatação ).O
-v
sinalizador direcionagrep
para encontrar e retornar todos os nomes de arquivos, excetodemo-app.zip
.Essa lista de arquivos é adicionada à nossa linha de comando como argumentos de origem no comando move
mv
. O argumento target é o caminho para o novo diretório passado para omkdir
referenciado using$_
e output usingecho
.fonte
Você pode até usar extensões de chaves:
Você precisa usar o bash 3.0 ou mais recente.
fonte
fonte
Minha solução de uma string:
fonte
Você pode encadear comandos:
mkdir ~/bar/baz | mv foo.c ~/bar/baz/
ou o shell script está aqui:
1. Abra qualquer editor de texto
2. Copie e cole o shell script.
3. Salve -o como mkdir_mv.sh
4. Digite o diretório do seu script:
cd your/script/directory
5. Altere o modo do arquivo :
chmod +x mkdir_mv.sh
6. Defina o alias :
alias mv="./mkdir_mv.sh"
agora, sempre que você executar o comando,
mv
o diretório em movimento será criado, se não existir.fonte
Com base em um comentário em outra resposta, aqui está a minha função shell.
Inclua isso no .bashrc ou similar para poder usá-lo em qualquer lugar.
fonte