저는 쉘 스크립팅을 처음 접해서 도움을 찾고 있습니다.
두 개의 매개변수 입력 파일 이름과 출력 파일 이름을 허용하는 프로그램이 있습니다.
이름이 다른 데이터 파일이 여러 개 있습니다. 각 파일이 개별적으로 처리되도록 모든 데이터 파일에서 이 프로그램을 실행하는 쉘 스크립트를 작성하고 싶습니다.
-s
각 출력 파일의 이름은 솔루션 파일임을 나타내기 위해 입력 파일의 이름이어야 합니다 . 다만 -s
이름의 기본 부분을 추가해야 하므로 가 file.txt
됩니다 file-s.txt
.
편집: 이와 비슷한 질문을 가진 모든 응답자에게 감사드립니다.여기 차이점은 제가 MS VS를 사용하지 않거나 C++ 코드에 문제가 있고 모든 데이터(수천 개의 .txt 파일)를 내 워크스테이션에서 동시에 처리하고 싶다는 것입니다.
답변1
GNU Parallel
프로그램을 사용하여 이 작업을 수행 할 수 있습니다 .
find . -name \*.txt | grep -v -e '\-s.txt$' | parallel echo program "{}" {.}-s.txt
program ./1 2.txt ./1 2-s.txt
program ./aaa.txt ./aaa-s.txt
program ./bbb.txt ./bbb-s.txt
program ./demo.txt ./demo-s.txt
program ./original_names.txt ./original_names-s.txt
답변2
다음과 같은 것을 원하는 것 같습니다.
for src; do
dst="${src%.txt}-s.txt"
program "$src" "$dst"
done
처리할 파일 이름으로 스크립트를 호출합니다. 중요한 부분은 확장자를 "${src%.txt}-s.txt"
제거 하고 ..txt
-s.txt
답변3
현재 두 개의 인수를 사용하여 프로그램을 호출한다고 가정하면 cmd input-file output-file
래퍼 스크립트를 다음과 같이 간단히 작성할 수 있습니다.
#!/bin/sh
for file; do
output="${file%.txt}"-s.txt
cmd "$file" "$output" &
done
그런 다음 여러 입력을 인수로 사용하여 스크립트를 호출합니다. 이 솔루션은 입력 파일이 모두 .txt
접미사를 가지고 있다고 가정합니다(실제로는 그렇지 않다고 가정하지만, 그렇지 않은 경우 출력 파일 이름이 이상해질 것입니다). 이로 인해 기존 출력 파일을 덮어쓸 수 있다는 점에 유의하세요. 우려되는 경우 이전 존재를 확인하는 몇 가지 논리를 추가하세요. 이 문제를 방지하려면 디렉터리를 만들고 모든 출력 파일을 새 디렉터리에 넣는 것이 더 안전할 수 있습니다. 또는 입력에서 파일 이름을 읽으려면(예: 호출 스크립트를 사용할 수 있음 < my-file-full-of-input-files-one-per-line ./my-script
) 다음과 같이 작성하십시오.
#!/bin/sh
while read file; do
output="${file%.txt}"-s.txt
cmd "$file" "$output" &
done