我想知道如何处理某个文件夹 dir1 中的文件(如果它们通过各种任务进行管道传输),最后我希望将输出写入相同的文件夹结构和文件名中,即说我有 2 个文件;dir1/file1
和dir1/file2
。我想要以下命令:
task1 dir1/* | task2 | task3 --output dir2/${filename}
输出dir2/file1
,dir2/file2
它应该代表已处理的文件。
答案1
循环遍历 中的文件dir1
,获取每个文件的基本名称,处理它,写入输出文件:
for path in dir1/*; do
name="${path##*/}"
task1 "$path" | task2 | task3 --output "dir2/$name"
done
变量替换${path##*/}
将获取变量的值path
并删除直到(包括)最后一个 的所有内容/
。这会生成文件的基本名称。
task1
然后对文件 in 执行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##*/}
' {} {} \;