如何将此脚本转换为别名(MacOS、ZSH)

如何将此脚本转换为别名(MacOS、ZSH)

当直接在控制台中输入该脚本时,该脚本可以正常工作:

N | find . -type f -iname "*.aac" -exec bash -c 'FILE="$1"; ffmpeg -i "${FILE}" -acodec libmp3lame "${FILE%.aac}.mp3";' _ '{}' \;

但当我尝试将其作为别名添加到我的~/.zshrc文件中时:

alias aac-to-mp3="N | find . -type f -iname \"*.aac\" -exec bash -c 'FILE=\"$1\"; ffmpeg -i \"${FILE}\" -acodec libmp3lame \"${FILE%.aac}.mp3\";' _ '{}' \;"

它产生:

 ✔  aac-to-mp3
_: N: command not found
ffmpeg version 4.4.1 Copyright (c) 2000-2021 the FFmpeg developers
  built with Apple clang version 13.0.0 (clang-1300.0.29.3)
  configuration: --prefix=/usr/local/Cellar/ffmpeg/4.4.1_3 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-avresample --enable-videotoolbox
  libavutil      56. 70.100 / 56. 70.100
  libavcodec     58.134.100 / 58.134.100
  libavformat    58. 76.100 / 58. 76.100
  libavdevice    58. 13.100 / 58. 13.100
  libavfilter     7.110.100 /  7.110.100
  libavresample   4.  0.  0 /  4.  0.  0
  libswscale      5.  9.100 /  5.  9.100
  libswresample   3.  9.100 /  3.  9.100
  libpostproc    55.  9.100 / 55.  9.100
: No such file or directory

我尝试将其N |移至命令本身:

alias aac-to-mp3="find . -type f -iname \"*.aac\" -exec bash -c 'FILE=\"$1\"; N | ffmpeg -i \"${FILE}\" -acodec libmp3lame \"${FILE%.aac}.mp3\";' _ '{}' \;"

但它会产生相同的输出。

我确实在每次别名更改之间重新启动了 shell。

如何使该脚本可用作别名?我不明白这个问题。

答案1

别名不能接受参数。你在这里需要一个函数。另外,请避免对 shell 变量名称使用大写字母。按照惯例,全局环境变量都是大写的,因此对自己的变量名使用大写可能会导致意外的错误。尝试将其添加到您的~/.zshrc文件中:

aac-to-mp3(){
    find . -type f -iname "*.aac" -exec \
        bash -c 'file="$1"; ffmpeg -n -i "$file" -acodec libmp3lame "${file%.aac}.mp3";' _ '{}' \;
}

ffmpeg 的-n选项将响应N任何提示,因此您无需尝试传递N给它(这就是 ffmpegN |试图做的事情,尽管以一种行不通的方式)。

答案2

您的命令包含在定义别名时由于使用双引号而扩展的参数。要为别名引用它,请尝试单引号:

alias aac-to-mp3='N | find . -type f -iname "*.aac" -exec bash -c '\''FILE="$1"; ffmpeg -i "${FILE}" -acodec libmp3lame "${FILE%.aac}.mp3";'\'' _ '\''{}'\'' \;'

不过,您可能应该只使用 zsh 。或许:

aac-to-mp3 () {
  setopt localoptions extendedglob
  local f
  for f (**/*.(#i)aac(ND.)) {
    ffmpeg -n -i $f -c:a libmp3lame $f:r.mp3
  }
}

这假设N就像yes n对“覆盖文件”说“不”?提示ffmpeg,在这种情况下你可以使用 ffmpeg 的-n选项。

相关内容