Scorri i file escludendo le directory


11

Ho bisogno che il mio script faccia qualcosa per ogni file nella directory corrente escludendo qualsiasi sottodirectory.

Ad esempio, nel percorso corrente, ci sono 5 file, ma 1 di questi è una cartella (una sottodirectory). Il mio script dovrebbe attivare un comando dato come argomenti durante l'esecuzione di detto script. Vale a dire "bash script wc -w" dovrebbe fornire il conteggio delle parole di ciascun file nella directory corrente, ma non una delle cartelle, in modo che l'output non abbia mai nessuna delle righe "/ sub / dir: Is a directory".

La mia sceneggiatura attuale:

#!/bin/bash
dir=`pwd`
for file in $dir/*
do
    $* $file
done

Devo solo escludere le directory per il loop, ma non so come.

Risposte:


11
#!/bin/bash -

for file in "$dir"/*
do
  if [ ! -d "$file" ]; then
      "$@" "$file"
  fi
done

Si noti che esclude anche i file di tipo symlink e in cui il symlink si risolve in un file di tipo directory (che è probabilmente quello che si desidera).

Alternativa (dai commenti), controlla solo i file:

for file in "$dir"/*
do
  if [ -f "$file" ]; then
      "$@" "$file"
  fi
done

@roaima buona idea!
Laktak,

2
Meglio usare if [ -f "$file" ]; then .... Non una directory restituirebbe non solo file normali ma anche socket e collegamenti simbolici.
JRFerguson,

@JRFerguson in base alla domanda del PO direi che includere prese e tubi sarebbe una pessima idea. Per quanto riguarda i symlink, quelli sono ! -dgià implicitamente inclusi .
roaima,

Ho usato [-f $ file] nel mio script finale. Notare la mancanza di virgolette nella condizione if. Quasi ovunque ho guardato tra virgolette intorno a $ file, ma ho dovuto eliminarle per far funzionare il mio script.
Tõnis Piip,

3

Ecco un'alternativa all'utilizzo di un ciclo for se ciò che devi fare è semplice (e non comporta l'impostazione delle variabili nella shell principale e c).

È possibile utilizzare findcon -exece utilizzare -maxdepth 1per evitare di ricorrere nella sottodirectory.

[ -n "$1" ] && find "$dir" -type f -mindepth 1 -maxdepth 1 -exec "$@" "{}" \;

L' [ -n "$1" ]è lì per evitare l'esecuzione di tutti i file nella directory in cui lo script non viene passato alcun argomento.


2

In zsh, è possibile utilizzare i qualificatori glob per limitare le corrispondenze di caratteri jolly per tipo di file. Ad esempio, l'aggiunta (.)dopo il modello lo limita ai file normali.

wc -w *(.)

Per far fronte ai nomi dei file che iniziano con -o ., utilizzare wc -c -- *(.N)o wc -c ./*(.N). Se vuoi includere anche collegamenti simbolici a file regolari, crealo *(-.).

Le altre shell comuni non hanno tale funzionalità, quindi è necessario utilizzare alcuni meccanismi diversi per filtrare per file come testare i tipi di file in un ciclo o find.


0

Bash for loop escluse le sottodirectory ('/') e i collegamenti (@):

for f in `ls|egrep -v '/|@'`; do echo $f; done
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.