Utfør kommando på alle filer i en katalog

Kan noen vennligst oppgi koden for å gjøre følgende: Anta at det er en katalog med filer, som alle må kjøres gjennom et program. Programmet sender ut resultatene til standard ut. Jeg trenger et skript som vil gå inn i en katalog, utføre kommandoen på hver fil og koble utdataene til en stor utdatafil.

For eksempel for å kjøre kommandoen på 1 fil:

$ cmd [option] [filename] > results.out
Løsning

Følgende bash-kode vil sende $file til kommandoen der $file vil representere hver fil i /dir

for file in /dir/*
do
  cmd [option] "$file" >> results.out
done

Eksempel

el@defiant ~/foo $ touch foo.txt bar.txt baz.txt
el@defiant ~/foo $ for i in *.txt; do echo "hello $i"; done
hello bar.txt
hello baz.txt
hello foo.txt
Kommentarer (8)

Hva med dette?

find /some/directory -maxdepth 1 -type f -exec cmd option {} \; > results.out
  • -maxdepth 1-argumentet forhindrer rekursivt søk i å stige ned i noen underkataloger. (Hvis du vil at slike nestede kataloger skal behandles, kan du utelate dette).
  • -type -f angir at bare vanlige filer skal behandles.
  • -exec cmd option {} forteller den at den skal kjøre cmd med den angitte option for hver fil som blir funnet, med filnavnet erstattet av {}.
  • \; angir slutten på kommandoen.
  • Til slutt omdirigeres utdataene fra alle de individuelle cmd-kjøringene til results.out.

Men hvis du bryr deg om rekkefølgen filene behandles i, er det kanskje bedre å skrive en løkke. kan det være bedre å skrive en løkke. Jeg tror find behandler filene i inode rekkefølge (selv om jeg kan ta feil om det), noe som kanskje ikke er hva du ønsker.

Kommentarer (5)

Basert på @Jim Lewis' tilnærming:

Her er en rask løsning ved hjelp av find og også sortering av filer etter endringsdato:

$ find  directory/ -maxdepth 1 -type f -print0 | \
  xargs -r0 stat -c "%y %n" | \
  sort | cut -d' ' -f4- | \
  xargs -d "\n" -I{} cmd -op1 {} 

For sortering se:

http://www.commandlinefu.com/commands/view/5720/find-files-and-list-them-sorted-by-modification-time

Kommentarer (3)