Skrypt powłoki Linuksa dla każdego pliku w katalogu Chwyć nazwę pliku i uruchom program

84

Scenariusz:

Folder w systemie Linux. Chcę przejrzeć każdy plik .xls w folderze.

Ten folder zazwyczaj składa się z różnych folderów, różnych typów plików (.sh, .pl, .csv, ...).

Chcę tylko przejrzeć wszystkie pliki w katalogu głównym i uruchomić program tylko na plikach .xls.

Edytować :

Problem polega na tym, że program, który muszę wykonać, to „xls2csv” do konwersji z formatu .xls do .csv. Więc dla każdego pliku .xls muszę pobrać nazwę pliku i dołączyć ją do .csv.

Na przykład mam plik test.xls, a argumenty z xls2csv to: xls2csv test.xls test.csv

Czy to miało sens?

ThinkCode
źródło

Odpowiedzi:

199

grzmotnąć:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done
Ignacio Vazquez-Abrams
źródło
Poprostu super! Działa świetnie! Dziękuję bardzo!
ThinkCode,
6
Właśnie tego szukałem z zupełnie innego powodu. Trochę edycji i jest idealny dla moich konkretnych potrzeb. Thanks = D A dla każdego, kto nie jest pewien, co to robi: $ {f% .ext} podstawia nazwę pliku bez rozszerzenia, więc w tym przykładzie zostanie wyrenderowany jako „nazwa_pliku.csv” zamiast „nazwa_pliku”. xls.csv ”.
Frungi
Heh Wyszukałem w Google „plik txt linux foreach” i znalazłem to. To było dokładnie to, czego potrzebowałem, faktycznie próbowałem użyć xls2csv, ale pomyślałem, że nie znajdę żadnych wyników wyszukiwania tego :)
akiller
1
$ f będzie miało wartość * .xls, jeśli * .xls nie pasuje do żadnego pliku. Sprawdź moją odpowiedź, jeśli to problem.
AndrewBourgeois
Lub możesz po prostu ustawić nullglob, aby pominąć pętlę.
Ignacio Vazquez-Abrams
15
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

Pierwsza linia dosprawdza, czy „pasujący” plik naprawdę istnieje, ponieważ w przypadku, gdy nic nie pasuje w Twoim for, dozostanie wykonany z „* .xls” jako $i. To może być okropne dla twojego xls2csv.

AndrewBourgeois
źródło
13

Spójrz na polecenie wyszukiwania .

To, czego szukasz, jest czymś w rodzaju

find . -name "*.xls" -type f -exec program 

Opublikował

find . -name "*.xls" -type f -exec xls2csv '{}' '{}'.csv;

wykona xls2csv file.xls file.xls.csv

Bliżej tego, czego chcesz.

Tomek
źródło
find -maxdepth 1aby wykluczyć podfoldery. To również konwertuje test.xlsna test.xls.csvzamiast test.csv. Więc nie do końca to, o co prosił OP, ale całkiem blisko.
ephemient
Używanie {}jako podłańcucha argumentu zamiast całego argumentu jest rozszerzeniem GNU, nie gwarantowanym przez specyfikację POSIX dla find. W związku z tym ta odpowiedź niekoniecznie jest przenośna na platformy inne niż GNU.
Charles Duffy
4
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

bash 4 (rekurencyjny)

shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done
ghostdog74
źródło
Doskonałe rozwiązanie. Użyłem tego, aby umożliwić mi pisanie haml / scss i wbudowanie w html / css w czasie projektowania dla projektu node.js.
Chris Kemp,
1
Jest to wręcz niebezpieczne, jeśli nie ufasz, że nazwy plików nie zawierają rzeczy takich jak $(rm -rf /)... lub po prostu spacje.
Charles Duffy