Estou analisando a saída de 'ls' e algo deu errado

1

Eu fiz este script simples para copiar um arquivo recursivamente para muitos subdiretórios. Aqui estou mostrando o problema para 3 subdiretórios. Eu tenho 3 subdiretórios e 2 arquivos em um diretório como segue

0.003/  0.007/  0.015/  program.cpp  driver.sh*

Eu quero copiar program.cpp para todos esses subdiretórios usando myscript.sh mostrado abaixo:

    #!/bin/bash
    mydir='pwd'

    for i in 'ls -la $mydir | grep "[0-9]$" | awk '{print $NF}''
    do
        if [ -e $mydir/ ]
        then
            echo "cp -i  $i/"
        else
            echo "File \"\" not found in current directory"
        fi
    done

Coloquei o cp dentro de echo para testar o código. A saída é estranha,

cp -i program.cpp 32/
cp -i program.cpp 0.003/
cp -i program.cpp 0.007/
cp -i program.cpp 0.015/

A saída de ls -la

total 32K
drwxr-xr-x. 5 gulu workg 4.0K Nov 29  2013 .
drwxr-xr-x. 7 gulu workg 4.0K Nov 29  2013 ..
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.003
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.007
drwxr-xr-x. 2 gulu workg 4.0K Nov 26 19:09 0.015
-rw-r--r--. 1 gulu workg 4.2K Nov 29  2013 program.cpp
-rwxr-xr-x. 1 gulu workg  982 Nov 26 08:22 driver.sh

A saída de ls -la $mydir | grep "[0-9]$" | awk '{print $NF}'

0.003
0.007
0.015

Existem apenas três valores em i , em seguida, como está a produzir quatro resultados? De qualquer forma, resolvi o problema com uma condição adicional [ -d $mydir/$i ] . Mas a minha pergunta é como o script está produzindo a primeira linha cp -i driver.sh 32/ ?

    
por souravc 28.11.2013 / 17:50

2 respostas

4

Isso ilustra por que você NUNCA deve confiar em analisar a saída do comando ls para iterar sobre o conteúdo do diretório - use um simples glob de shell em vez de, por exemplo. para corresponder a qualquer nome de arquivo terminado em um dígito

for f in $mydir/*[0-9]
do
    if [ -e $mydir/ ]
    .
    .
done

A respeito de como ele está produzindo a linha cp -i driver.sh 32/ , você pode ver que quando você digita dígitos na saída de ls -la , ele corresponde à linha total: 32K , bem como aos nomes de diretório desejados.

    
por steeldriver 28.11.2013 / 18:22
1

Isso ilustra por que você NUNCA deve confiar em analisar a saída do comando ls para iterar o conteúdo do diretório - use um simples comando find :

find . -maxdepth 1 -type d --regex './[0-9]+$' -exec cp  {} \;
    
por waltinator 08.04.2015 / 01:39