movendo diretórios após grep

1

Eu tenho isseued o próximo comando, a fim de mover alguns diretórios para a pasta "build_tools" no entanto, o resultado não foi o que eu esperava.

ls -l | grep 2014-03 | awk '{if ($8!=build_tools) print $8}' | xargs mkdir build_tools/{} && mv {}/ build_tools/{}/

Ele moveu a pasta "build_tools" para um dos pastas produzidas pelo awk (zlib) juntamente com o resto dos diretórios e, em seguida, ficou preso com esta mensagem:

mkdir: no se puede crear el directorio «zlib»: El archivo ya existe

Alguém pode esclarecer qual é o meu erro?

EDIT 1:

A saída de ls -l me dá:

drwxr-xr-x  3 poissonbreaker poissonbreaker     4096 2011-05-02 09:58 antlr3.2
-rw-r--r--  1 poissonbreaker poissonbreaker   318588 2011-05-17 16:21 AppFramework-1.03.jar
-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
drwxr-xr-x  4 poissonbreaker poissonbreaker     4096 2013-01-11 23:13 clutter-sharp
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Eu só quero obter os arquivos com o campo de data ($ 6) correspondente 2014-03, é por isso que eu faço um simples grep como (Nenhum arquivo no diretório tem como nome do arquivo este padrão):

ls -l  | grep 2014-03 

Quais rendimentos:

-rw-r--r--  1 poissonbreaker poissonbreaker        0 2014-03-04 09:53 awk
-rw-r--r--  1 poissonbreaker poissonbreaker      429 2014-01-14 09:49 Dependencias

Então eu recebo o campo filename ($ 8) de cada arquivo através do awk para finalmente ser movido para a pasta build_tools (Neste ponto eu sei qual foi o meu erro - a pasta build_tools também foi criada nesta data: S). Vou deixar essa questão aqui, no caso de algumas partes serem úteis para qualquer um.

EDIT 2:   Eu mudei a expressão awk para:

awk '{if ($8!=build_tools) print $8}'

para fazer sentido.

    
por poissonbreaker 04.03.2014 / 09:39

2 respostas

1

Suponho que você tenha o GNU find . Se você quiser mover arquivos ou diretórios modificados em um determinado período de tempo (por exemplo, março de 2014), faça o seguinte:

find . -maxdepth 1 \
-newermt 2014-02-28 -not -newermt 2014-04-01 \
-not -name 'build_tools' \
-exec mv {} build_tools \+

Explicação:

  • encontre neste diretório, sem subdiretórios
  • arquivos no intervalo entre 28 de fevereiro e 1º de abril, em que mt se refere ao horário da modificação. Você também pode usar ct para pesquisar pelo tempo de criação.
  • que não são nomeados build_tools
  • mova todos eles para build_tools . O \+ significa que todos os nomes de arquivos / diretórios encontrados são substituídos em {} , em vez de um por vez. Se você quiser um de cada vez, precisará de \; .

Algumas coisas:

  • Não analise a saída de ls . O formato depende do sistema operacional, e a seleção de colunas com awk falhará se os nomes de arquivos / diretórios contiverem espaço em branco.

  • Você usou & para concatenar comandos, mas & apenas coloca um processo em segundo plano. Se em tudo, você deve ter usado && , mas, no geral, seria bastante complicado conseguir o que você quer.

por 04.03.2014 / 10:07
0

A versão correta para minha solução precisa do xargs para manipular vários comandos, que podem ser obtidos agrupando os comandos com:

sh -c (or bash -c) 'Command1; Command2; .. Comandn'

Portanto, a solução correta é:

ls -l awk ' $8!=build_tools && $6 ~ /2013-03*/ {print $8}' | xargs -I @ sh -c 'mkdir build_tools/@; mv @ build_tools/@'

Tenha em atenção que isto cria uma nova pasta para cada ficheiro para mover.

O resultado é que, enquanto outros cuidam de tornar nossa vida mais fácil com ferramentas melhores e especializadas, ainda podemos aprender muito com consultas antigas de canais. Pelo menos no meu caso:)

    
por 05.03.2014 / 12:48