입력과 이름이 같은 파일에 출력을 어떻게 쓸 수 있나요?

입력과 이름이 같은 파일에 출력을 어떻게 쓸 수 있나요?

특정 폴더 dir1의 파일을 처리하는 방법을 알고 싶습니다(다양한 작업을 통해 파이프되는 경우). 마지막에는 출력이 동일한 폴더 구조와 파일 이름에 기록되기를 원합니다. 즉, 파일이 2개 있다고 가정합니다. dir1/file1그리고 dir1/file2. 나는 다음 명령을 원합니다 :

task1 dir1/* | task2 | task3 --output dir2/${filename}

Output dir2/file1- dir2/file2처리된 파일을 나타내야 합니다.

답변1

file 의 파일을 반복하고 dir1, 각 파일의 기본 이름을 가져와서 처리하고, 출력 파일에 씁니다.

for path in dir1/*; do
    name="${path##*/}"
    task1 "$path" | task2 | task3 --output "dir2/$name"
done

변수 대체는 ${path##*/}변수의 값을 사용하여 path마지막 변수까지 모든 것을 제거합니다 /. 그러면 파일의 기본 이름이 생성됩니다.

task1그런 다음 의 파일이 실행되고 dir1결과가 에 전달되고 task2해당 출력이 에 제공됩니다 task3. 마지막 작업은 dir2/$name해당 스위치의 피연산자 로 사용됩니다 --output. 여기서 는 $name경로가 없는 파일 이름입니다 $path.

답변2

cd "dir1" && \
find . -maxdepth 1 -type f -exec sh -c '
   # task2 on "$1" | task3  > "/path/to/dir2/${1##*/}
' {} {} \;

관련 정보