gpt4 book ai didi

bash - 使用复杂命令查找通过管道传输到 xargs

转载 作者:行者123 更新时间:2023-11-29 09:43:00 31 4
gpt4 key购买 nike

我正在尝试处理位于磁盘上许多不同位置的 DVD 文件。它们的共同点是它们(每组输入文件)都位于名为 VIDEO_TS 的目录中。每种情况下的输出都是一个以该目录的父目录命名的文件。

我知道我可以获得每个目录的完全限定路径:

find /Volumes/VolumeName -type d -name "VIDEO_TS" -print0

我可以通过管道传递到 xargs 来获取父目录:

find /Volumes/VolumeName -type d -name "VIDEO_TS" -print0 | xargs -0 -I{} dirname {}

而且我还知道我可以通过附加以下内容自行获取父目录名称:

| xargs -o I{} basename {}

我想不通的是如何将这些参数传递给,例如手刹CLI:

./HandBrakeCLI -i /path/to/filename/VIDEO_TS -o /path/to/convertedfiles/filename.m4v

我在这里阅读了有关 shell 的扩展能力的信息,并怀疑这会在这里有所帮助(一开始不使用 dirname 或 basename),但我读得越多,我就越困惑!

最佳答案

你实际上并不需要 xargs为此:您可以将 NUL 分隔的流读入 shell 循环,然后直接从那里运行您想要的命令。

#!/bin/bash

source_dir=/Volumes/VolumeName
dest_dir=/Volumes/OtherName

while IFS= read -r -d '' dir; do
name=${dir%/VIDEO_TS} # trim /VIDEO_TS off the end of dir, assign to name
name=${name##*/} # remove everything before last remaining / from name
./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v"
done < <(find "$source_dir" -type d -name "VIDEO_TS" -print0)

参见 the article Using Find在 Greg 的维基上,或 BashFAQ #001有关在 bash 中处理输入流的一般信息,或 BashFAQ #24了解使用流程替换(此处的 <(...) 构造)而不是从查找管道进入循环的值(value)。


此外,find包含 -exec可以按如下方式使用的操作:

source_dir=/Volumes/VolumeName
dest_dir=/Volumes/OtherName

export dest_dir # export allows use by subprocesses!

find "$source_dir" -type d -name "VIDEO_TS" -exec bash -c '
for dir; do
name=${dir%/VIDEO_TS}
name=${name##*/}
./HandBrakeCLI -i "$dir" -o "$dest_dir/$name.m4v"
done
' _ {} +

这会将参数列表中找到的目录名称直接传递给用 bash -c 调用的 shell .由于 for 的默认对象要迭代的循环是 "$@" ,参数列表,这隐式地遍历 find 找到的目录.

关于bash - 使用复杂命令查找通过管道传输到 xargs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35041491/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com