Procura pelo arquivo na pasta1 e executa um script se esse arquivo não estiver na pasta2

1

folder1 contém apenas .flv arquivos.

folder2 contém apenas .mp4 arquivos.

Todos os arquivos .flv em folder1 DEVEM ter um arquivo correspondente que termine em .mp4 em folder2 :

/folder1/123.flv e /folder2/123.mp4 .

Eu preciso de um script que encontre .flv sem um .mp4 e execute um script que execute o mencoder para criar o .mp4 correspondente. Eu fiz o meu melhor, isso é o que eu tenho, mas estou preso com as declarações IF THEN.

for i in 'find /folder1 -type f -iname '*.flv' -printf "%f\n" | 
    sed 's/.flv//g'' ; do 
    if [[ -n $(find /folder2/$i.mp4 -exec grep \-q 0 {} \;) ]] then
        /scripts/script.sh $i  fi ; done

O script bash precisa ser executado da seguinte forma:

/scripts/script.sh $i 

para o nome do arquivo sem qualquer extensão.

    
por JCats 08.11.2015 / 23:37

1 resposta

1

Tente isto:

find folder1 -type f -iname '*.flv' -exec bash -c \
    'f=${1#folder1/}; [ -f "folder2/${f%.flv}.mp4" ] || 
     scripts/script.sh "${1%.flv}"' none {} \;

Isso funcionará com arquivos cujos nomes contenham espaços em branco ou outros caracteres difíceis.

Como funciona

  • find folder1 -type f -iname '*.flv'

    Isto encontra os arquivos flv

  • -exec bash -c '...'

    Para cada arquivo flv encontrado, isso diz ao find para executar o bash, que executa o script entre aspas (veja abaixo).

  • f=${1#folder1/}

    Isso cria uma variável f que tem o nome do arquivo flv sem o diretório principal.

  • [ -f "folder2/${f%.flv}.mp4" ]

    Isso testa para ver se existe um arquivo mp4 correspondente.

  • ||

    Isto diz ao bash para executar o comando que segue somente se o comando anterior retornou false (em outras palavras, se nenhum arquivo mp4 foi encontrado).

  • scripts/script.sh "${1%.flv}"'

    Isso executa seu script nos arquivos flv que não possuem arquivos mp4. Os arquivos são fornecidos para script.sh com a parte .flv removida.

  • none {}

    Isso diz ao bash para atribuir a string none a $0 (esse alocador de espaço nunca é usado) e atribuir o nome do arquivo encontrado por find , denotado {} , à variável de shell $1 .

  • \;

    Isso sinaliza o fim do comando -exec do find.

por 09.11.2015 / 00:12