Как записать вывод в файл с тем же именем, что и вход?

Мне интересно, как обрабатывать файлы из какой-либо папки dir1, если они передаются по различным задачам, и в конце мне хотелось бы, чтобы результат был написан в той же структуре папок и именах файлов, то есть у меня есть 2 файла; dir1 / file1 и dir1 / file2. Мне нужна следующая команда:

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

для вывода dir2 / file1 и dir2 / file2, которые должны представлять обработанные файлы.

2 Solutions collect form web for “Как записать вывод в файл с тем же именем, что и вход?”

Перебирайте файлы в каталоге dir1 , получите базовое имя каждого файла, обработайте его, напишите в выходной файл:

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

Переменная подстановки ${path##*/} примет значение переменной path и удалит все до (и включает) последнее / . Это создает базовое имя файла.

task1 затем выполняется в файле в каталоге dir1 , результат передается на task2 а результат этого присваивается task3 . Последняя задача использует dir/$name в качестве операнда для своего переключателя --output .

 cd "dir1" && \ find . -maxdepth 1 -type f -exec sh -c ' # task2 on "$1" | task3 > "/path/to/dir2/${1##*/} ' {} {} \; 
Linux и Unix - лучшая ОС в мире.