Armazena variável em outra variável [fechada]

1

Estou tentando armazenar o conteúdo da minha variável no loop for na minha outra variável, mas obtenho

0403-006 Execute permission denied

Ajuda.

while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do 
for f in directory/*
    do
        files=$($f | awk -F "_" '{print $3}')
        echo $files
    done
done <test.txt

Eu tenho permissões completas para executar isso, erros quando eu coloco no echo $ files

    
por Josh Adams 15.06.2018 / 17:25

3 respostas

1

Analisando sua sua própria resposta , fica mais claro o que você realmente gostaria de fazer.

Aqui está minha opinião:

#!/bin/sh

dupsfile='/archival/test/sppark/dataindex/staging/duplicates.txt'

indir='/archival/test/sppark/datapdf/staging/renamedTriage'
baddir='/archival/test/sppark/datapdf/staging/badFiles'

dups=$( mktemp )
cut -d '|' -f 4 <"$dupsfile" >"$dups"

for pathname in "$indir"/*; do
    [ ! -f "$pathname" ] && continue

    string=$( printf '%s\n' "${pathname##*/}" | cut -d '_' -f 4 )

    if grep -qxF "$string" "$dups" then
        echo mv "$pathname" "$baddir"
    fi
done

rm "$dups"

A diferença entre sua própria resposta e isso é que a lista de arquivos é gerada apenas uma vez e não uma vez por linha no arquivo de dados.

O arquivo de dados é analisado de forma que sua coluna 4 | -delimited seja extraída e salva em um arquivo temporário. Este arquivo é consultado uma vez para cada arquivo no diretório que você está investigando, usando grep . Se o 4 _ -delimited do nome do arquivo estiver presente nesse arquivo temporário, o arquivo será movido. Remova o echo para mover arquivos.

    
por 15.06.2018 / 21:37
2

Não está claro o que o seu script está fazendo e parece completamente errado. Você precisa fornecer mais detalhes para descobrir o que exatamente está errado e o que você deseja alcançar. Meu palpite é que o erro vem dessa linha:

files=$($f | awk -F "_" '{print $3}')

Em particular, você precisa entender o que acontece aqui:

$f | awk -F "_" '{print $3}'

Você está executando $f , que é um dos arquivos directory/* . Um deles é 0403-006 e você não pode executá-lo.

E as variáveis col1 , col2 , etc? Os dados lidos de test.txt estão completamente sem uso.

Apresente um exemplo mínimo e completo com dados de entrada e saída esperada, pois esse script não parece sadio, mesmo que eu esteja certo.

    
por 15.06.2018 / 18:17
0

Eu modifiquei meu script para fazer exatamente o que eu quero

while IFS='|' read -r col1 col2 col3 col4 col5 col6 col7
do 
    for f in /archival/test/sppark/datapdf/staging/renamedTriage/*
    do
        files=$(echo "$f" | awk -F "_" '{print $4}')
        if [[ $col4 == $files ]]; then
            mv $f /archival/test/sppark/datapdf/staging/badFiles/
        fi
    done
done </archival/test/sppark/dataindex/staging/duplicates.txt

Meu loop while lê meu arquivo txt, lê cada coluna delimitada por |. Eu tenho um loop for loop através de cada arquivo no meu diretório, e se o meu $col4 é o mesmo que o $files , ele irá mover o arquivo para o meu diretório especificado

    
por 15.06.2018 / 20:54

Tags