Execute o comando em cada subdiretório na linha de comando

1

Eu quero acrescentar um '0' a cada nome de arquivo com um único inteiro como o nome do arquivo, ie.

1.jpg --> 01.jpg

Eu usei o seguinte comando, mas ele não fez nada.
Você pode dizer o problema ou o que mais fazer?:

find . -maxdepth 1 -type d \( ! -name . \) -exec fish -c "cd '{}' ; 
for f in *;
  if [ (string length '$f') -eq '5' ];
    mv '$f' '0$f';
  end;
end; " \;

O mesmo comando parece funcionar na linha de comando, mas não quando chamado via script. A mesma coisa quando tento chamar seq (sem intervalo explicitamente mencionado) de um script ... diz "operando ausente".

    
por Rohan 08.12.2016 / 04:32

2 respostas

1

Veja se isso funciona para você:

find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"

Isto irá encontrar todos os arquivos no diretório atual que consistem em um único dígito e terminam com uma extensão de 3 caracteres. Se você quiser diretórios em vez de arquivos (como no seu exemplo), substitua -type f por -type d . Se você precisar permitir extensões mais longas, poderá ajustar o padrão de pesquisa. Se você precisar pesquisar recursivamente, remova o parâmetro -maxdepth 1 . A saída deste comando será os comandos a serem executados para fazer as renomeações. Por exemplo:

$ ls
10.png  1.png  2.png  3.png

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n"
mv "./3.png" "./03.png"
mv "./2.png" "./02.png"
mv "./1.png" "./01.png"

Se a saída parece correta, você pode executá-la canalizando a saída do comando find para o seu shell:

$ find . -maxdepth 1 -type f -name "[0-9].???" -printf "mv \"%p\" \"%h/0%f\"\n" | fish

$ ls
01.png  02.png  03.png  10.png
    
por 08.12.2016 / 17:16
0

Uma solução de peixe que não envolva o comando find ficaria assim:

#!/usr/bin/env fish
for f in *.jpg
    if string match -qr '^\d\.' -- $f
        mv $f 0$f
    end
end
for f in **/*.jpg
    set p (string split --right --max=1 / -- $f)
    if string match -qr '^\d\.' -- $p[2]
        mv $f $p[1]/0$p[2]
    end
end

Você poderia fazer isso com um único loop para obter os arquivos jpg no diretório atual, bem como todos os subdiretórios:

for ***.jpg
    do stuff
end

No entanto, isso complica a lógica dentro do bloco for, porque os arquivos no cwd não terão um componente de diretório.

    
por 08.12.2016 / 21:12