Exclua nomes de arquivos semelhantes de uma matriz usando shell script

Exclua nomes de arquivos semelhantes de uma matriz usando shell script

Eu tenho uma série de arquivos, por exemplo file=[a.yml, a.json,b.yml,b.json]. Estou iterando usando forloop. Preciso excluir a .jsonexecução dos arquivos quando houver .ymlou .yamle .jsonno array. mas se eu tiver apenas .jsonno array (exemplo [a.json,b.json], ele precisa passar pelo loop. Isso é possível com shell script?

Basicamente, estou tentando comparar as strings em uma matriz e excluir a duplicata dinamicamente.

Isso é possível com shell?


filename=$(git show --pretty="format:" --name-only $CODEBUILD_RESOLVED_SOURCE_VERSION)
echo "$filename"
mkdir report || echo "dir report exists"
for file in ${filename}; do
    echo ${file}
    ext=${file##*.}
    if [ $ext == "yaml" ] || [ $ext == "yml" ] || [ $ext == "json" ]; then
        if [ ${file} != "buildspec.yml" ] && [ ${file} != "stackupdatebuildspec.yml" ] && [ ${file} != "specs.json" ]; then
            stack=$(echo ${file} | cut -d "." -f 1)
            stackName="${stack//[\/]/-}"
            echo ${stackName}
            howmany() { echo $#; }
            numOfFilesValidated=$(howmany $listOfFilesToScan)
            echo "=========================================== Syntax validation started =============================================================="
            cfSyntaxLogFile="cf-syntax-validation-output"
            numOfFailures=0
            numOfValidatedFiles=0
            for file_to_scan in $listOfFilesToScan; do
                if [[ $(cfn-lint -t "$file_to_scan" --parameter-values-path "${stack}.json" --append-rules ./append_rules --override-spec ./over_ride_spec/spec.json |& tee -a $cfSyntaxLogFile) == "" ]]; then
                    echo "INFO: Syntax validation of template $file: SUCCESS"
                    ((numOfValidatedFiles++))
                else
                    echo "ERROR: Syntax validation of template $file: FAILURE"
                    ((numOfFailures++))
                fi
            done'''

Responder1

Você pode ver se possui o outro valor antes de prosseguir:Verifique se uma matriz bash contém um valor.

Você também pode manter apenas os .jsonarquivos na matriz e verificar posteriormente no loop a existência do .ymlarquivo.

bashtem uma boa substituição de parâmetro para isso:

${parameter%word}

Remove matching suffix pattern.

No seu caso, seria algo assim (retirando .jsone adicionando .yml:

if [ ! -f "${filename%.json}.yml" ]
then
    # process
fi

Responder2

Tente algo assim:

declare -A fhash

# Load $files array with 'git show -z' - NUL-separated filenames in case
# of spaces, newlines, etc.
mapfile -d '' -t files < <(git show -z --pretty="format:" --name-only "$CODEBUILD_RESOLVED_SOURCE_VERSION")

# build an associative array (hash) from the files array, so we can easily
# check if a matching .yml filename exists for .json and .yaml files.
for f in "${files[@]}"; do
  fhash["$f"]=1
done

# now process each of the filenames in the $files array.
for f in "${files[@]}"; do
  # ignore these filenames
  [[ $f =~ ^(buildspec.yml|stackupdatebuildspec.yml|specs.json)$ ]] && continue

  base=${f%.*}       # get base filename
  ext=".${f##*.}"    # get file's "extension"

  # ignore '.json' and .'yaml' files if there is a matching .yml filename.
  # also ignore .json files if there is a matching .yaml filename
  [[ $ext =~ \.(json|yaml)$ ]] && [ "${fhash[$base.yml]}"  -eq 1 ] && continue
  [[ $ext =~ \.json$        ]] && [ "${fhash[$base.yaml]}" -eq 1 ] && continue

  # The code so far has skipped/ignored all of the files we don't want to
  # process, so you can do whatever you need with "$f".

  # ... your code here ...
done

informação relacionada