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?
nullglob
, aby pominąć pętlę.for i in *.xls ; do [[ -f "$i" ]] || continue xls2csv "$i" "${i%.xls}.csv" done
Pierwsza linia
do
sprawdza, czy „pasujący” plik naprawdę istnieje, ponieważ w przypadku, gdy nic nie pasuje w Twoimfor
,do
zostanie wykonany z „* .xls” jako$i
. To może być okropne dla twojegoxls2csv
.źródło
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.
źródło
find -maxdepth 1
aby wykluczyć podfoldery. To również konwertujetest.xls
natest.xls.csv
zamiasttest.csv
. Więc nie do końca to, o co prosił OP, ale całkiem blisko.{}
jako podłańcucha argumentu zamiast całego argumentu jest rozszerzeniem GNU, nie gwarantowanym przez specyfikację POSIX dlafind
. W związku z tym ta odpowiedź niekoniecznie jest przenośna na platformy inne niż GNU.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
źródło
$(rm -rf /)
... lub po prostu spacje.