Copie todos os arquivos com um determinado nome de arquivo de comprimento

3

No diretório /source , gostaria de copiar todos os arquivos com um nome de arquivo com mais de 15 caracteres para o diretório /dest . Existe um comando UNIX para fazer isso?

EDITAR : Embora esta questão explica como procurar um nome de arquivo de um certo tamanho, minha pergunta também pergunta como copiar o arquivo.

    
por Adam_G 04.01.2016 / 00:32

4 respostas

6

Você pode criar um padrão com 16 ou mais caracteres e copiar esses arquivos.

Uma abordagem simples (mas não elegante), usando 16% de caracteres?, cada um correspondendo a qualquer caractere único:

for n in /source/????????????????*;do [ -f "$n" ] && cp "$n" /dest/; done

Após o 16º ? , use * para corresponder a qualquer número de caracteres. O padrão pode não corresponder a nada, então um teste -f para garantir que é um arquivo ainda é necessário.

    
por 04.01.2016 / 00:46
9

Tanto quanto sei, não há nenhum comando para fazer especificamente isso, mas você pode tirar proveito dos padrões de shell glob:

cp /source/????????????????* /dest

Existem 16 pontos de interrogação precedendo o asterisco (você afirmou que queria "mais de 15 caracteres", o que significa "pelo menos 16").

Abaixo estão as ressalvas da minha resposta atual:

  • Dependendo da configuração do seu shell, isso pode não copiar arquivos "ocultos" (ou seja, arquivos que começam com ponto ( . ))
  • Isso não copiará nenhum diretório que seja filho direto de /source . Ele simplesmente emitirá um aviso para cada diretório com um comprimento de nome de arquivo > 15 caracteres. Se você quiser recursivamente copiar tudo em /source e manter a hierarquia, essa resposta será um pouco mais envolvida.
por 04.01.2016 / 00:48
6

A solução ????????????????????? está bem, a menos que você, como eu, não possa contar acima de oito. Nesse caso, você pode usar find :

find . -maxdepth 1 -regextype posix-egrep -regex '.{17,}' -exec cp -t /dest {} +
  • Observe que 17 deve ser usado para levar em conta o ./ precedente.
  • -regextype posix-egrep é necessário para permitir chaves {} padrão. O tipo de regex padrão para find é emacs , o que não permite isso.
  • o destino deve ser colocado como um primeiro argumento cp ( -t option) para tratar todas as saídas de {} + como as origens.
por 04.01.2016 / 01:27
3

Se referindo-se a um sistema Linux com GNU, Gawk, então abaixo está uma solução. A fonte é /home/my_folder , copiando para /dest para nomes de arquivos com mais de 7 caracteres, supondo que não haja nomes de arquivos com espaços:

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'

Quais resultados:

cp /home/my_folder/orbit-antixcat /dest/orbit-antixcat;
cp /home/my_folder/spacefm-antixcat-569be3dc.tmp /dest/spacefm-antixcat-569be3dc.tmp;
cp /home/my_folder/xsession-modified-date /dest/xsession-modified-date;

Se isso estiver correto, envie o shell para copiar os arquivos:

ls /home/my_folder/ |awk '{if(length($0)>7){print "cp /home/my_folder/"$0" /dest/"$0";";}}'|bash

Pode adicionar algumas citações para acomodar arquivos com espaços em seus nomes:

ls /home/my_folder |awk '{if(length($0)>7){print "cp 7/home/my_folder/"$0"7 7/dest/"$0"7;";}}'|bash

Exemplo de saída com aspas:

cp '/home/my_folder/kdecache-antixcat' '/dest/kdecache-antixcat';
cp '/home/my_folder/ksocket-antixcat' '/dest/ksocket-antixcat';

Pode especificar o binário cp se estiver com um alias; talvez haja uma confirmação ao sobrescrever que você não quer.

ls /home/my_folder |awk '{if(length($0)>2){print "/bin/cp 7/home/my_folder/"$0"7 7/dest/"$0"7;";}}'|bash

Acima pode ser modificado para copiar diretórios, se necessário; atualmente eles são omitidos.

    
por 04.01.2016 / 01:02