Do not speak Portuguese? Translate this site with Google or Bing Translator
Como escrever um loop Bash Shell sobre um conjunto de arquiv

Posted on: August 13, 2021 11:00 PM

Posted by: Renato

Views: 1086

Como escrever um loop Bash Shell sobre um conjunto de arquivos

Como executo o loop de shell sobre um conjunto de arquivos armazenados em um diretório atual ou diretório especificado?

Você pode usar o loop for facilmente sobre um conjunto de arquivos de shell no bash ou qualquer outro shell do UNIX usando o caractere curinga.

 

Tutorial details
Difficulty level Easy
Root privileges No
Requirements Bash under Linux, macOS or Unix
Est. reading time 3 minutes
 

Syntax

A sintaxe geral é a seguinte:

 

for f in file1 file2 file3 file5
do
 echo "Processing $f"
 # do something on $f
done

Você também pode usar variáveis ​​de shell:

FILES="file1
/path/to/file2
/etc/resolv.conf"
for f in $FILES
do
	echo "Processing $f"
done

Você pode percorrer todos os arquivos, como * .c, digite:

$ for f in *.c; do echo "Processing $f file.."; done

Amostra de script de shell para percorrer todos os arquivos

#!/bin/bash
# NOTE : Quote it else use array to avoid problems #
FILES="/path/to/*"
for f in $FILES
do
  echo "Processing $f file..."
  # take action on each file. $f store current file name
  cat "$f"
done

Como verificar se o arquivo não existe no Bash

- https://www.cyberciti.biz/faq/bash-check-if-file-does-not-exist-linux-unix/

Podemos descobrir se existe um arquivo com expressões condicionais em um shell Bash. Em outras palavras, bash for loop não funcionará cegamente em arquivos. Pense nisso como à prova de falhas:

#!/bin/bash
FILES="/etc/sys*.conf"
for f in $FILES
do
# FAILSAFE #
# Check if "$f" FILE exists and is a regular file and then only copy it #
  if [ -f "$f" ]
  then
    echo "Processing $f file..."
    cp -f "$f" /dest/dir
  else
    echo "Warning: Some problem with \"$f\""
  fi
done

Expansão de nome de arquivo

Você pode fazer a expansão do nome do arquivo em loop, como trabalhar em todos os arquivos PDF no diretório atual:

for f in *.pdf
do
 
	echo "Removing password for pdf file - $f"
	# always "double quote" $f to avoid problems
	/path/to/command --option "$f"
done

No entanto, há um problema com a sintaxe acima. Se não houver arquivos PDF no diretório atual, ele se expandirá para * .pdf (ou seja, f será definido como * .pdf ”). Para evitar esse problema, adicione a seguinte instrução antes do loop for:

#!/bin/bash
# Usage: remove all utility bills pdf file password 
shopt -s nullglob
for f in *.pdf
do
	echo "Removing password for pdf file - $f"
        pdftk "$f" output "output.$f" user_pw "YOURPASSWORD-HERE"
done
# unset it now 
shopt -u nullglob
 
# rest of the script below

Usando uma variável Shell e loop while

Você pode ler a lista de arquivos de um arquivo de texto. Por exemplo, crie um arquivo de texto chamado /tmp/data.txt da seguinte maneira:

file1
file2
file3

Agora você pode usar o loop while da seguinte maneira para ler e processar um por um:

#!/bin/bash
while IFS= read -r file
do
	[ -f "$file" ] && rm -f "$file"
done < "/tmp/data.txt"

Aqui está outro exemplo que remove todos os arquivos indesejados de lighttpd / nginx chrootado ou servidor da web Apache:

#!/bin/bash
_LIGHTTPD_ETC_DEL_CHROOT_FILES="/usr/local/nixcraft/conf/apache/secure/db/dir.etc.list"
secureEtcDir(){
        local d="$1"
        local _d="/jails/apache/$d/etc"
        local __d=""
        [ -f "$_LIGHTTPD_ETC_DEL_CHROOT_FILES" ] || { echo "Warning: $_LIGHTTPD_ETC_DEL_CHROOT_FILES file not found. Cannot secure files in jail etc directory."; return; }
        echo "* Cleaning etc FILES at: \"$_d\" ..."
        while IFS= read -r file
        do
                __d="$_d/$file"
                [ -f "$__d" ] && rm -f "$__d"
        done < "$_LIGHTTPD_ETC_DEL_CHROOT_FILES"
}
 
secureEtcDir "nixcraft.net.in"

Processando argumentos de linha de comando

Aqui está outro exemplo simples:

#!/bin/bash
# make sure you always put $f in double quotes to avoid any nasty surprises i.e. "$f"
# we use "$@" (with double quotes) instead of $* or $@ because
# we want to prevent whitespace problems with filenames. 
for f in "$@"
do
  echo "Processing $f file..."
  # rm "$f"
done

O seguinte não funcionará, pois citamos duas vezes "$ *". Em outras palavras, não haverá divisão de palavras e o loop será executado apenas uma vez. Portanto, use a sintaxe acima:

#!/bin/bash
# make sure you always put $f in double quotes to avoid any nasty surprises i.e. "$f"
for f in "$*"
do
  echo "Processing $f file..."
  # rm "$f"
done

Observe que $ @ expandido como “$ 1” “$ 2” “$ 3”… “$ n” e $ * expandido como “$ 1y $ 2y $ 3y… $ n”, onde y é o valor da variável IFS, ou seja, “$ * ”É uma string longa e $ IFS age como um separador ou delimitador de token.

Bash Shell Loop sobre um conjunto de arquivos

O exemplo a seguir usa variáveis ​​de shell para armazenar nomes de caminho reais e, em seguida, os arquivos são processados ​​usando o loop for:

#!/bin/bash
_base="/jail/.conf"
_dfiles="${_base}/nginx/etc/conf/*.conf"
 
for f in $_dfiles
do
        lb2file="/tmp/${f##*/}.$$"   #tmp file
        sed 's/Load_Balancer-1/Load_Balancer-2/' "$f" > "${lb2file}"   # update signature 
        scp "${lb2file}" nginx@lb2.nixcraft.net.in:${f}   # scp updated file to lb2
        rm -f "${lb2file}"
done

Resumindo

Você aprendeu a escrever ou configurar o bash para arquivos de loop-over. É fácil, mas deve-se tomar cuidado ao lidar com arquivos inexistentes ou arquivos com caracteres especiais, como espaços em branco. Para superar esses dois problemas, podemos combinar os comandos find e xargs da seguinte forma:

# Search all pdf files  copy it safely 
#
# Tested on GNU/Linux, macOS and FreeBSD (BSD/find/xargs) 
#
find /dir/to/search -type f -name "*.pdf" -print0  | xargs -0 -I {} echo "Working on {}"
find /dir/to/search -type f -name "*.pdf" -print0  | xargs -0 -I {} cp "{}" /dest/dir
 
#
# Find all "*.c" files in ~/project/ and move to /nas/oldproject/ dir
# Note -iname is same as -name but the match is case insensitive.
#
find ~/projects/ -type f -iname "*.c" |\
xargs -0 -I {} mv -v "{}" /nas/oldprojects/

 

Onde encontrar opções de comando são:

Where find command options are:

  1. -type f : Only search files
  2. -name "*.pdf" OR -iname "*.c" : Search for all pdf files. The -iname option enables case insensitive match for all C files.
  3. -print0 : Useful to deal with spacial file names and xargs. It will print the full file name on the standard output (screen), followed by a null character (instead of the newline character that -print uses). This allows file names that contain newlines or other types of white space to be correctly interpreted by programs that process the find output. This option corresponds to the -0 option of xargs.

The output of find command is piped out to the xargs command, and xargs options are:

  1. -0 : Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode.
  2. -I {} : Replace occurrences of {} in the initial-arguments with names read from standard input i.e. find command output.
  3. echo OR cp : Shell command to run over this file denoted by {}

See man pages:
man bash
help for
man find
man xargs

Exemplo que precisei para CSV

shell script #Linux
 
for f in *.csv
do
    echo "Copy for csv file - $f"
    # always "double quote" $f to avoid problems
    curl -T /var/lib/docker/volumes/docker-postgresql11-replication_pg_data/_data/pg_log/"$f" -u admin:password "ftp://127.0.0.1:21/dumps/"$f""
    #/path/to/command --option "$f"
done

Fonte:

- https://www.cyberciti.biz/faq/bash-loop-over-file/

 

 
 

 

 


4

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (15) Variados (109) PHP (130) Laravel (158) Black Hat (3) front-end (28) linux (113) postgresql (39) Docker (27) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (54) devops (25) nodejs (5) npm (2) nvm (1) git (8) firefox (1) react (6) reactnative (5) collections (1) javascript (6) reactjs (7) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (11) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (4) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (1) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (40) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (1) jwt (4) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (2) Architecture (3) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (1) autorizacao (2) authentication (4) authorization (2) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1)

New Articles



Get Latest Updates by Email