Eu criei o seguinte script que move arquivos antigos, conforme definido do diretório de origem para o diretório de destino. Está funcionando perfeitamente.
#!/bin/bash
echo "Enter Your Source Directory"
read soure
echo "Enter Your Destination Directory"
read destination
echo "Enter Days"
read days
find "$soure" -type f -mtime "-$days" -exec mv {} "$destination" \;
echo "Files which were $days Days old moved from $soure to $destination"
Esse script move arquivos muito bem. Também move arquivos do subdiretório de origem, mas não cria subdiretórios no diretório de destino. Eu quero implementar esse recurso adicional nele.
com exemplo
/home/ketan : source directory
/home/ketan/hex : source subdirectory
/home/maxi : destination directory
Quando executo esse script, ele também move os arquivos hexadecimais no diretório maxi, mas preciso que o mesmo hexadecimal seja criado no diretório maxi e mova seus arquivos no mesmo hexadecimal para lá.
fonte
for x do
, você tem uma falta;
lá :). Além disso, não tenho ideia do que você queria alcançar,$0
mas estou convencido de que seriash
:).for x; do
tecnicamente não é compatível com POSIX (verifique a gramática ), mas os shells modernos permitem ambosfor x do
efor x; do
; algumas velhas conchas Bourne não grunhiramfor x; do
. Nas conchas modernas, comsh -c '…' arg0 arg1 arg2 arg3
,arg0
torna-se$0
,arg1
torna-se$1
, etc. Se você quer$0
sersh
, precisa escreversh -c '…' sh arg1 arg2 arg3
. Novamente, algumas conchas Bourne se comportaram de maneira diferente, mas o POSIX especifica isso.pushd
parece uma escolha melhor quecd
, por ser menos invasiva no ambiente atual.Eu sei que
find
foi especificado, mas isso parece um trabalho pararsync
.Eu costumo usar o seguinte:
Aqui está um bom exemplo se você deseja mover apenas arquivos de um tipo de arquivo específico ( exemplo ):
fonte
--remove-source-files
útil, o que efetivamente faz com que os arquivos sejam movidos em vez de copiados. Este é um ótimo uso do rsync.você poderia fazer isso usando duas instâncias de find (1)
Sempre tem cpio (1)
Verifique os argumentos para cpio. Os que eu dei
fonte
Não é tão eficiente, mas o código é mais fácil de ler e entender, na minha opinião, se você apenas copiar os arquivos e depois excluir.
Aviso: falha descoberta pelo @MV para operações automatizadas:
fonte
Você pode fazer isso anexando o caminho absoluto do arquivo retornado
find
ao seu caminho de destino:fonte
$destination
contiver caracteres especiais, pois sofre expansão no shell interno. Talvez você quis dizerdestination='\'"$destination"\''
? Isso ainda continua'
. Além disso, isso cria arquivos como, em/home/maxi/home/ketan/hex/foo
vez de/home/maxi/hex/foo
.Melhor (mais rápido e sem consumir espaço de armazenamento fazendo cópia em vez de mover), também não é afetado pelos nomes dos arquivos se eles contiverem caracteres especiais em seus nomes:
Ou mais rápido, movendo vários arquivos ao mesmo tempo para várias CPUs, usando o comando "paralelo":
PS: Você tem um erro de digitação, "soure" deve ser "fonte". Eu mantive o nome da variável.
fonte
Isso é menos elegante, mas fácil se o número / tamanho dos arquivos não for muito grande
Compacte seus arquivos em um
zip
arquivo e descompacte no destino sem a-j
opção. Por padrão, o zip criará a estrutura de diretórios relativa.fonte
Tente desta maneira:
fonte
Como parece não haver uma solução realmente fácil para isso e eu preciso muito disso, criei este utilitário de código aberto para linux (requer python): https://github.com/benapetr/smv
Existem várias maneiras de usá-lo para alcançar o que você precisa, mas provavelmente o mais simples seria algo como isto:
Além disso, você pode executá-lo no modo seco para não fazer nada além de imprimir o que faria
Ou caso essa lista de arquivos seja muito longa para caber na linha de argumento e você não se importe de executar o python para cada arquivo, então
fonte