디렉토리의 각 파일에 대한 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.xls에 test.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.