后续作品
任务:列出所有包含 iname 文件
*AlbumArt*
且也包含 iname的文件夹*cover*.jpg
,并为每个文件夹列出所有具有大小的 jpg 文件find . -type f -iname '*AlbumArt*' -print0 | sort -z \ | xargs -0 -I "{}" bash -c ' find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \ | uniq -z | xargs -0 -I "{}" bash -c ' ls -la "$(dirname "${1}")"/*.jpg;' _ "{}" \;
我到底想做什么?
我想列出包含 iname*cover*.jpg
和 iname的所有文件夹*AlbumArt*
,并列出该文件夹中每个图像文件的大小,还打开 nautilus,以便我可以手动检查该文件夹中的这些图像(因为我想删除一些额外的文件),这我想要一次处理一个文件夹。因此,对于 xargs 的每个输出,我想要ls -la
打开 nautilus 并等待 nautilus 关闭,所以我nautilus "${1}"; read -r -p "Press any key to continue" Continue;
在上面添加了:
find . -type f -iname '*AlbumArt*' -print0 | sort -z \
| xargs -0 -I "{}" bash -c '
find "$(dirname "${1}")" -maxdepth 1 -iname "*cover*.jpg" -print0' _ "{}" \; \
| uniq -z | xargs -0 -I "{}" bash -c '
ls -la "$(dirname "${1}")"/*.jpg; nautilus "${1}"; read -r -p "Press any key to continue" Continue;' _ "{}" \;
这有效,但它不会因用户输入而停止,即read -r -p "Press any key to continue" Continue;
打开几个 nautilus 窗口!但我想一次只打开一个 nautilus,所以我希望 xargs 在每次执行该行后等待。
我应该怎么做才能让 xargs 在执行完每一行之后等待用户输入?
答案1
由于该read
命令位于由 调用的 shell 中xargs
,因此其标准输入是/dev/null
(对于大多数 xargs 实现)或从中读取的管道xargs
。要从终端读取它,请重定向其标准输入:read … </dev/tty
。
我还没有审查过你的代码。看起来很复杂。仅迭代所有目录会更简单,而且可能不会明显变慢。
shopt -s globstar nullglob nocaseglob
# Caveat: this matches symbolic links to directories. And in
# versions of bash prior to 5.0 traverses (some of) those symlinks.
for d in **/*/; do
a=( "$d"/*albumart* )
c=( "$d"/*cover*.jpg )
if (( ${#a[@]} > 0 && ${#c[@]} > 0} )); then
ls -ld -- "$d"/*.jpg
nautilus -- "${c[@]}"
read -r -p "Press <Return> to continue" Continue
fi
done