Ls

如何將命令輸出(ls)用於其他命令的輸入(sox)?

  • May 22, 2018

我有一個包含多個 .wav 文件的文件夾,我試圖按順序連接這些文件,但我認為我對 bash 命令太缺乏經驗,無法盡可能高效地執行此操作。你看,我不知道如何使用文件內容作為命令的輸入:

我以正確的順序獲取所有文件名:

ls *.wav | sort -V > script

腳本:

ep1-s1.wav
ep2-s1.wav
ep3-s1.wav

我在每行後添加“\”以在命令中使用

lam script -s " \\" > script2

腳本2:

ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav \

我刪除了最後一個’':

sed '$ s/.$//' script2 > script3

腳本3:

ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav

現在我想將該文件的內容用於sox,例如:

sox ep1-s1.wav \
ep2-s1.wav \
ep3-s1.wav output.wav

我怎樣才能做到這一點?

現在,可能有一種方法可以在一個命令中執行此操作,但我無法弄清楚管道是如何工作的:如果你知道怎麼做,我真的很想知道!

就像我在評論中提到的那樣,如果您不需要版本排序 ( sort -V),您可以簡單地執行sox *wav. 在 Linux 中,*wav將進行文件名擴展,產生按字母順序排列的文件名列表。這受您的區域設置影響,尤其是LC_COLLATE,您可以通過 Google 獲取更多資訊。

如果您需要sort -V,處理此問題的正確方法是使用以空字元結尾的字元串和數組來處理帶有空格和其他特殊字元的文件名。此腳本會將sort命令的輸出放入一個數組並sox使用此列表執行。

#!/bin/bash

unset wav_files

while IFS= read -r -d '' file; do
  wav_files+=("$file")
done < <(find . -maxdepth 1 -type f -name "*wav" -print0 | sort -V -z)

if (( ${#wav_files[@]} == 0 )); then
  echo "No wav files found"
else
  sox -- "${wav_files[@]}"
fi

這可能超出您的預期,但這是一種很好的做法;)

引用自:https://unix.stackexchange.com/questions/445171