Сценарій оболонки Linux для кожного файлу в каталозі Візьміть ім'я файлу та запустіть програму


84

Сценарій:

Папка в системі Linux. Я хочу прокрутити кожен файл .xls у папці.

Ця папка зазвичай складається з різних папок, різних типів файлів (.sh, .pl, .csv, ...).

Все, що я хочу зробити, це прокрутити всі файли в кореневій папці та виконати програму лише на файлах .xls.

Редагувати:

Проблема полягає в тому, що програма, яку я повинен виконати, це 'xls2csv' для перетворення з .xls у формат .csv. Отже, для кожного .xls-файлу я повинен захопити ім'я файлу та додати його до .csv.

Наприклад, у мене є файл test.xls, а аргументи xls2csv такі: xls2csv test.xls test.csv

Я мав сенс?

Відповіді:


199

баш:

for f in *.xls ; do xls2csv "$f" "${f%.xls}.csv" ; done

Просто чудово! Працює ідеально! Дуже дякую!
ThinkCode

6
Це саме те, що я шукав із зовсім іншої причини. Трохи редагування, і це ідеально підходить для моїх конкретних потреб. Дякуємо = D І для тих, кому незрозуміло, що це робить: $ {f% .ext} замінює ім'я файлу без розширення, тому в цьому прикладі воно буде відображатись у "filename.csv", а не "filename". xls.csv ".
Frungi,

Хе, я погуглив "lxt foreach txt файл" і знайшов це. Це було саме те, що мені потрібно, я насправді намагався використовувати xls2csv, але вирішив, що не знайду результатів, які б шукали це :)
akiller

1
$ f матиме значення * .xls, якщо * .xls не відповідає жодному файлу. Перевірте мою відповідь, якщо це проблема.
AndrewBourgeois

Або ви можете просто встановити nullglobдля того, щоб пропустити цикл.
Ігнасіо Васкес-Абрамс,

15
for i in *.xls ; do 
  [[ -f "$i" ]] || continue
  xls2csv "$i" "${i%.xls}.csv"
done

Перший рядок у doперевірках , якщо файл «узгодження» дійсно існує, тому що в разі , якщо нічого не сірники в вашому for, то doбуде виконуватися з «* .xls» , як $i. Це може бути жахливим для вас xls2csv.


13

Подивіться на команду find .

Те, що ви шукаєте, це щось на зразок

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

Редагування публікації

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

буде виконувати xls2csv file.xls file.xls.csv

Ближче до того, що ви хочете.


find -maxdepth 1щоб виключити підпапки. Це також перетворюється test.xlsна test.xls.csvзамість test.csv. Тож не зовсім те, про що просив ОП, але досить близько.
ефемієнт

Використання {}в якості підрядка аргументу, а не цілого аргументу, є розширенням GNU, не гарантоване специфікацією POSIX для find. Таким чином, ця відповідь не обов'язково переноситься на платформи, що не належать до GNU.
Чарльз Даффі

4
find . -type f -name "*.xls" -printf "xls2csv %p %p.csv\n" | bash

bash 4 (рекурсивний)

shopt -s globstar
for xls in /path/**/*.xls
do
  xls2csv "$xls" "${xls%.xls}.csv"
done

Відмінне рішення. Я використав це, щоб дозволити мені писати haml / scss та вбудовувати в html / css під час проектування проекту node.js.
Кріс Кемп,

1
Це відверто небезпечно, якщо ви не довіряєте вашим іменам файлів не містити таких речей, як $(rm -rf /)... або просто пробіли.
Чарльз Даффі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.