Find - xargs,为每一行打开一个新的 shell 并执行命令并等待用户退出该 shell

Find - xargs,为每一行打开一个新的 shell 并执行命令并等待用户退出该 shell

后续作品

  • 任务:列出所有包含 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

相关内容