디렉토리의 각 파일에 대한 Linux 쉘 스크립트 파일 이름을 잡고 프로그램 실행


84

시나리오 :

Linux 시스템의 폴더. 폴더의 모든 .xls 파일을 반복하고 싶습니다.

이 폴더는 일반적으로 다양한 폴더, 다양한 파일 형식 (.sh, .pl, .csv, ...)으로 구성됩니다.

내가 원하는 것은 루트의 모든 파일을 반복 하고 .xls 파일에서만 프로그램을 실행하는 것입니다.

편집하다 :

문제는 내가 실행해야하는 프로그램이 .xls에서 .csv 형식으로 변환하는 'xls2csv'라는 것입니다. 따라서 각 .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.csv"로 렌더링됩니다. xls.csv "입니다.
Frungi

Heh 나는 "linux foreach txt 파일"을 구글 검색하고 이것을 발견했습니다. 이것은 정확히 내가 필요로하는 것이 었습니다. 실제로 xls2csv를 사용하려고했지만 검색 결과를 찾을 수 없다고 생각했습니다. :)
akiller

1
* .xls가 어떤 파일과도 일치하지 않으면 $ f 값은 * .xls입니다. 그것이 문제라면 내 대답을 확인하십시오.
AndrewBourgeois

또는 nullglob루프를 건너 뛰도록 설정할 수도 있습니다 .
Ignacio Vazquez-Abrams

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

필드에 첫 번째 라인 do은 "일치"파일이 정말 때문에 당신의 경우 아무것도 경기에서, 존재하는 경우 검사는 for의는 do"* .XLS"등으로 실행됩니다 $i. 이것은 xls2csv.


13

상기 봐 찾기 명령.

당신이 찾고있는 것은 다음과 같습니다.

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.xlstest.xls.csv대신 test.csv. 그래서하지 영업 이익은하지만 아주 가까이에 대해 무엇을 요구.
ephemient

{}전체 인수가 아닌 인수의 하위 문자열로 사용 하는 것은 GNU 확장이며 find. 따라서이 답변은 반드시 비 GNU 플랫폼으로 이식 할 수있는 것은 아닙니다.
Charles Duffy

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를 작성하고 node.js 프로젝트의 디자인 타임에 html / css로 빌드 할 수있었습니다.
Chris Kemp

1
파일 이름에 $(rm -rf /)... 또는 공백 과 같은 것을 포함하지 않는 것을 신뢰하지 않는다면 이것은 매우 위험합니다 .
Charles Duffy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.