우선, 출력을 파일 목록으로 사용하지 마십시오ls
. 쉘 확장 또는을 사용하십시오 find
. ls + xargs 오용 의 잠재적 결과 와 올바른 xargs
사용법 의 예는 아래를 참조하십시오 .
1. 간단한 방법 : for 루프
아래의 파일 만 처리하려면 A/
간단한 for
루프로 충분합니다.
for file in A/*.dat; do ./a.out < "$file" > "${file%.dat}.ans"; done
2. pre1 왜 안돼 ls | xargs
?
다음 은 업무에 ls
함께 사용하면 상황이 어떻게 변할 수 있는지에 대한 예입니다 xargs
. 다음 시나리오를 고려하십시오.
먼저 빈 파일을 만들어 봅시다 :
$ touch A/mypreciousfile.dat\ with\ junk\ at\ the\ end.dat
$ touch A/mypreciousfile.dat
$ touch A/mypreciousfile.dat.ans
파일을 참조하십시오.
$ ls -1 A/
mypreciousfile.dat
mypreciousfile.dat with junk at the end.dat
mypreciousfile.dat.ans
$ cat A/*
다음을 사용하여 마술 명령을 실행하십시오 xargs
.
$ ls A/*.dat | xargs -I file sh -c "echo TRICKED > file.ans"
결과:
$ cat A/mypreciousfile.dat
TRICKED with junk at the end.dat.ans
$ cat A/mypreciousfile.dat.ans
TRICKED
당신은 단지 관리했습니다 그래서 모두 덮어 mypreciousfile.dat
와 mypreciousfile.dat.ans
. 해당 파일에 내용이 있으면 지워졌을 것입니다.
2. 사용 xargs
: 적절한 방법으로 find
사용을 주장 xargs
하려면 -0
(널 종료 이름)을 사용하십시오.
find A/ -name "*.dat" -type f -print0 | xargs -0 -I file sh -c './a.out < "file" > "file.ans"'
두 가지 사항에 유의하십시오.
- 이 방법으로 당신은
.dat.ans
결말로 파일을 만들 것입니다 ;
- 이 끊어집니다 일부 파일 이름에 인용 부호를 포함하는 경우 (
"
).
두 가지 문제는 서로 다른 쉘 호출 방식으로 해결할 수 있습니다.
find A/ -name "*.dat" -type f -print0 | xargs -0 -L 1 bash -c './a.out < "$0" > "${0%dat}ans"'
3. 모든 내에서 수행 find ... -exec
find A/ -name "*.dat" -type f -exec sh -c './a.out < "{}" > "{}.ans"' \;
이것은 다시 .dat.ans
파일을 생성 하고 파일 이름에을 포함하면 중단됩니다 "
. 그것에 대해하려면 bash
호출 방식을 사용 하고 변경하십시오.
find A/ -name "*.dat" -type f -exec bash -c './a.out < "$0" > "${0%dat}ans"' {} \;